diff --git a/components/dashboard/src/components/AuthorizeGit.tsx b/components/dashboard/src/components/AuthorizeGit.tsx index b53d2a7f59679d..8b796a4881023c 100644 --- a/components/dashboard/src/components/AuthorizeGit.tsx +++ b/components/dashboard/src/components/AuthorizeGit.tsx @@ -8,7 +8,6 @@ import { AuthProviderInfo } from "@gitpod/gitpod-protocol"; import { FC, useCallback, useContext } from "react"; import { Link } from "react-router-dom"; import { useAuthProviders } from "../data/auth-providers/auth-provider-query"; -import { useCurrentOrg } from "../data/organizations/orgs-query"; import { openAuthorizeWindow } from "../provider-utils"; import { getGitpodService } from "../service/service"; import { UserContext, useCurrentUser } from "../user-context"; @@ -16,6 +15,7 @@ import { Button } from "./Button"; import { Heading2, Heading3, Subheading } from "./typography/headings"; import classNames from "classnames"; import { iconForAuthProvider, simplifyProviderName } from "../provider-utils"; +import { useOrgMembersInfoQuery } from "../data/organizations/org-members-info-query"; export function useNeedsGitAuthorization() { const authProviders = useAuthProviders(); @@ -28,7 +28,7 @@ export function useNeedsGitAuthorization() { export const AuthorizeGit: FC<{ className?: string }> = ({ className }) => { const { setUser } = useContext(UserContext); - const org = useCurrentOrg(); + const orgMembersInfo = useOrgMembersInfoQuery(); const authProviders = useAuthProviders(); const updateUser = useCallback(() => { getGitpodService().server.getLoggedInUser().then(setUser); @@ -57,7 +57,7 @@ export const AuthorizeGit: FC<{ className?: string }> = ({ className }) => { {verifiedProviders.length === 0 ? ( <> No Git integrations - {!!org.data?.isOwner ? ( + {!!orgMembersInfo.data?.isOwner ? (
You need to configure at least one Git integration. diff --git a/components/dashboard/src/components/UsageBasedBillingConfig.tsx b/components/dashboard/src/components/UsageBasedBillingConfig.tsx index 5e1efff651177f..7c578064243627 100644 --- a/components/dashboard/src/components/UsageBasedBillingConfig.tsx +++ b/components/dashboard/src/components/UsageBasedBillingConfig.tsx @@ -21,6 +21,7 @@ import { Button } from "./Button"; import { useCreateHoldPaymentIntentMutation } from "../data/billing/create-hold-payment-intent-mutation"; import { useToast } from "./toasts/Toasts"; import { ProgressBar } from "./ProgressBar"; +import { useOrgMembersInfoQuery } from "../data/organizations/org-members-info-query"; const BASE_USAGE_LIMIT_FOR_STRIPE_USERS = 1000; @@ -33,6 +34,7 @@ let didAlreadyCallSubscribe = false; export default function UsageBasedBillingConfig({ hideSubheading = false }: Props) { const currentOrg = useCurrentOrg().data; + const orgMembersInfo = useOrgMembersInfoQuery().data; const attrId = currentOrg ? AttributionId.create(currentOrg) : undefined; const attributionId = attrId && AttributionId.render(attrId); const [showUpdateLimitModal, setShowUpdateLimitModal] = useState(false); @@ -154,8 +156,8 @@ export default function UsageBasedBillingConfig({ hideSubheading = false }: Prop // Pick a good initial value for the Stripe usage limit (base_limit * team_size) // FIXME: Should we ask the customer to confirm or edit this default limit? let limit = BASE_USAGE_LIMIT_FOR_STRIPE_USERS; - if (attrId?.kind === "team" && currentOrg) { - limit = BASE_USAGE_LIMIT_FOR_STRIPE_USERS * currentOrg.members.length; + if (attrId?.kind === "team" && orgMembersInfo) { + limit = BASE_USAGE_LIMIT_FOR_STRIPE_USERS * orgMembersInfo.members.length; } const newLimit = await getGitpodService().server.subscribeToStripe( attributionId, @@ -190,7 +192,7 @@ export default function UsageBasedBillingConfig({ hideSubheading = false }: Prop ); } }, - [attrId?.kind, attributionId, currentOrg, location.pathname, refreshSubscriptionDetails], + [attrId?.kind, attributionId, orgMembersInfo, location.pathname, refreshSubscriptionDetails], ); const showSpinner = !attributionId || isLoadingStripeSubscription || isCreatingSubscription; diff --git a/components/dashboard/src/data/organizations/org-invitation-query.ts b/components/dashboard/src/data/organizations/org-invitation-query.ts new file mode 100644 index 00000000000000..c8547c17d95ac3 --- /dev/null +++ b/components/dashboard/src/data/organizations/org-invitation-query.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2023 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { OldOrganizationInfo, getOldQueryKey, useCurrentOrg } from "./orgs-query"; +import { teamsService } from "../../service/public-api"; +import { Code, ConnectError } from "@connectrpc/connect"; +import { useCurrentUser } from "../../user-context"; + +export const useOrgInvitationQuery = () => { + const user = useCurrentUser(); + const org = useCurrentOrg().data; + const queryClient = useQueryClient(); + + return useQuery<{ invitationId?: string }>({ + queryKey: getOrgInvitationQueryKey(org?.id ?? ""), + staleTime: 1000 * 60 * 2, // 2 minute + queryFn: async () => { + if (!org) { + throw new Error("No org selected."); + } + try { + const resp = await teamsService.getTeamInvitation({ teamId: org.id }); + return { invitationId: resp.teamInvitation?.id }; + } catch (err) { + const e = ConnectError.from(err); + if (e.code === Code.Unimplemented) { + const data = queryClient.getQueryData(getOldQueryKey(user)); + const foundOrg = data?.find((orgInfo) => orgInfo.id === org.id); + return { invitationId: foundOrg?.invitationId }; + } + throw err; + } + }, + enabled: !!org, + }); +}; + +export const getOrgInvitationQueryKey = (orgId: string) => ["org-invitation", { orgId }]; diff --git a/components/dashboard/src/data/organizations/org-members-info-query.ts b/components/dashboard/src/data/organizations/org-members-info-query.ts new file mode 100644 index 00000000000000..21af5435f80a9b --- /dev/null +++ b/components/dashboard/src/data/organizations/org-members-info-query.ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2023 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { OrgMemberInfo } from "@gitpod/gitpod-protocol"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { OldOrganizationInfo, getOldQueryKey, useCurrentOrg } from "./orgs-query"; +import { publicApiTeamMembersToProtocol, teamsService } from "../../service/public-api"; +import { useCurrentUser } from "../../user-context"; +import { TeamRole } from "@gitpod/public-api/lib/gitpod/experimental/v1/teams_pb"; +import { Code, ConnectError } from "@connectrpc/connect"; + +export interface OrgMembersInfo { + members: OrgMemberInfo[]; + isOwner: boolean; +} + +export const useOrgMembersInfoQuery = () => { + const user = useCurrentUser(); + const org = useCurrentOrg().data; + const queryClient = useQueryClient(); + + return useQuery({ + queryKey: getOrgMembersInfoQueryKey(org?.id ?? "", user?.id ?? ""), + staleTime: 1000 * 60 * 1, // 1 minute + queryFn: async () => { + if (!org) { + throw new Error("No org selected."); + } + try { + const resp = await teamsService.listTeamMembers({ teamId: org.id }); + return { + members: publicApiTeamMembersToProtocol(resp.members), + isOwner: + resp.members.findIndex( + (member) => member.userId === user?.id && member.role === TeamRole.OWNER, + ) >= 0, + }; + } catch (err) { + const e = ConnectError.from(err); + if (e.code === Code.Unimplemented) { + const data = queryClient.getQueryData(getOldQueryKey(user)); + const foundOrg = data?.find((orgInfo) => orgInfo.id === org.id); + return { + members: foundOrg?.members ?? [], + isOwner: foundOrg?.isOwner ?? false, + }; + } + throw err; + } + }, + enabled: !!org && !!user, + }); +}; + +export const getOrgMembersInfoQueryKey = (orgId: string, userId: string) => ["org-members", { orgId, userId }]; diff --git a/components/dashboard/src/data/organizations/orgs-query.ts b/components/dashboard/src/data/organizations/orgs-query.ts index a24c11186b2965..7448dc76c02f44 100644 --- a/components/dashboard/src/data/organizations/orgs-query.ts +++ b/components/dashboard/src/data/organizations/orgs-query.ts @@ -11,35 +11,46 @@ import { useLocation } from "react-router"; import { publicApiTeamMembersToProtocol, publicApiTeamToProtocol, teamsService } from "../../service/public-api"; import { useCurrentUser } from "../../user-context"; import { noPersistence } from "../setup"; +import { getOrgInvitationQueryKey } from "./org-invitation-query"; +import { getOrgMembersInfoQueryKey } from "./org-members-info-query"; +import { Code, ConnectError } from "@connectrpc/connect"; -export interface OrganizationInfo extends Organization { +export interface OldOrganizationInfo extends Organization { members: OrgMemberInfo[]; isOwner: boolean; invitationId?: string; } +export type OrganizationInfo = Pick; + export function useOrganizationsInvalidator() { const user = useCurrentUser(); + const org = useCurrentOrg(); const queryClient = useQueryClient(); return useCallback(() => { console.log("Invalidating orgs... " + JSON.stringify(getQueryKey(user))); queryClient.invalidateQueries(getQueryKey(user)); - }, [user, queryClient]); + queryClient.invalidateQueries(getOldQueryKey(user)); + if (org.data?.id && user?.id) { + queryClient.invalidateQueries(getOrgInvitationQueryKey(org.data.id)); + queryClient.invalidateQueries(getOrgMembersInfoQueryKey(org.data.id, user.id)); + } + }, [user, org.data, queryClient]); } -export function useOrganizations() { +export function useOldOrganizationsQuery() { const user = useCurrentUser(); - const query = useQuery( - getQueryKey(user), + const query = useQuery( + getOldQueryKey(user), async () => { - console.log("Fetching orgs... " + JSON.stringify(getQueryKey(user))); + console.log("Fetching orgs with old api... " + JSON.stringify(getOldQueryKey(user))); if (!user) { - console.log("useOrganizations with empty user"); + console.log("useOldOrganizationsQuery with empty user"); return []; } const response = await teamsService.listTeams({}); - const result: OrganizationInfo[] = []; + const result: OldOrganizationInfo[] = []; for (const org of response.teams) { const members = publicApiTeamMembersToProtocol(org.members || []); const isOwner = members.some((m) => m.role === "owner" && m.userId === user?.id); @@ -63,8 +74,52 @@ export function useOrganizations() { return query; } -function getQueryKey(user?: User) { - return noPersistence(["organizations", user?.id]); +export function useOrganizations() { + const user = useCurrentUser(); + const queryClient = useQueryClient(); + const query = useQuery( + getQueryKey(user), + async () => { + console.log("Fetching orgs... " + JSON.stringify(getQueryKey(user))); + if (!user) { + console.log("useOrganizations with empty user"); + return []; + } + try { + const response = await teamsService.getTeamList({}); + return response.teams; + } catch (err) { + const e = ConnectError.from(err); + if (e.code === Code.Unimplemented) { + const data = queryClient.getQueryData(getOldQueryKey(user)); + return ( + data?.map((org) => ({ + id: org.id, + name: org.name, + slug: org.slug, + })) ?? [] + ); + } + throw err; + } + }, + { + enabled: !!user, + cacheTime: 1000 * 60 * 60 * 1, // 1 hour + staleTime: 1000 * 60 * 60 * 1, // 1 hour + // We'll let an ErrorBoundary catch the error + useErrorBoundary: true, + }, + ); + return query; +} + +export function getQueryKey(user?: User) { + return noPersistence(["new-organizations", user?.id]); +} + +export function getOldQueryKey(user?: User) { + return noPersistence(["old-organizations", user?.id]); } // Custom hook to return the current org if one is selected diff --git a/components/dashboard/src/menu/OrganizationSelector.tsx b/components/dashboard/src/menu/OrganizationSelector.tsx index b3930080177d56..59e0454522568a 100644 --- a/components/dashboard/src/menu/OrganizationSelector.tsx +++ b/components/dashboard/src/menu/OrganizationSelector.tsx @@ -12,11 +12,13 @@ import { useCurrentOrg, useOrganizations } from "../data/organizations/orgs-quer import { useLocation } from "react-router"; import { User } from "@gitpod/gitpod-protocol"; import { useOrgBillingMode } from "../data/billing-mode/org-billing-mode-query"; +import { useOrgMembersInfoQuery } from "../data/organizations/org-members-info-query"; export default function OrganizationSelector() { const user = useCurrentUser(); const orgs = useOrganizations(); const currentOrg = useCurrentOrg(); + const orgMembersInfo = useOrgMembersInfoQuery().data; const { data: billingMode } = useOrgBillingMode(); const getOrgURL = useGetOrgURL(); @@ -39,9 +41,9 @@ export default function OrganizationSelector() { ), diff --git a/components/dashboard/src/teams/Members.tsx b/components/dashboard/src/teams/Members.tsx index d83c2c2b4d8b56..794caf98747ca1 100644 --- a/components/dashboard/src/teams/Members.tsx +++ b/components/dashboard/src/teams/Members.tsx @@ -22,10 +22,14 @@ import { SpinnerLoader } from "../components/Loader"; import { Delayed } from "../components/Delayed"; import { InputField } from "../components/forms/InputField"; import { InputWithCopy } from "../components/InputWithCopy"; +import { useOrgMembersInfoQuery } from "../data/organizations/org-members-info-query"; +import { useOrgInvitationQuery } from "../data/organizations/org-invitation-query"; export default function MembersPage() { const user = useCurrentUser(); const org = useCurrentOrg(); + const orgInvitation = useOrgInvitationQuery(); + const orgMembersInfo = useOrgMembersInfoQuery(); const invalidateOrgs = useOrganizationsInvalidator(); const [showInviteModal, setShowInviteModal] = useState(false); @@ -38,14 +42,14 @@ export default function MembersPage() { } // orgs without an invitation id invite members through their own login page const link = new URL(window.location.href); - if (!org.data.invitationId) { + if (!orgInvitation.data?.invitationId) { link.pathname = "/login/" + org.data.slug; } else { link.pathname = "/orgs/join"; - link.search = "?inviteId=" + org.data.invitationId; + link.search = "?inviteId=" + orgInvitation.data.invitationId; } return link.href; - }, [org.data]); + }, [org.data, orgInvitation.data]); const resetInviteLink = async () => { await teamsService.resetTeamInvitation({ teamId: org.data?.id }); @@ -66,17 +70,17 @@ export default function MembersPage() { }; const isRemainingOwner = useMemo(() => { - const owners = org.data?.members.filter((m) => m.role === "owner"); + const owners = orgMembersInfo.data?.members.filter((m) => m.role === "owner"); return owners?.length === 1 && owners[0].userId === user?.id; - }, [org.data?.members, user?.id]); + }, [orgMembersInfo.data?.members, user?.id]); const isOwner = useMemo(() => { - const owners = org.data?.members.filter((m) => m.role === "owner"); + const owners = orgMembersInfo.data?.members.filter((m) => m.role === "owner"); return !!owners?.some((o) => o.userId === user?.id); - }, [org.data?.members, user?.id]); + }, [orgMembersInfo.data?.members, user?.id]); // Note: We would hardly get here, but just in case. We should show a loader instead of blank section. - if (org.isLoading) { + if (org.isLoading || orgMembersInfo.isLoading) { return ( @@ -85,7 +89,7 @@ export default function MembersPage() { } const filteredMembers = - org.data?.members.filter((m) => { + orgMembersInfo.data?.members.filter((m) => { if (!!roleFilter && m.role !== roleFilter) { return false; } @@ -204,7 +208,7 @@ export default function MembersPage() { - {org.data?.isOwner ? ( + {orgMembersInfo.data?.isOwner ? ( - {!!org?.data?.invitationId && ( + {!!orgInvitation?.data?.invitationId && ( diff --git a/components/dashboard/src/teams/OrgSettingsPage.tsx b/components/dashboard/src/teams/OrgSettingsPage.tsx index 6ac480cc412ba9..24ff1804aa348d 100644 --- a/components/dashboard/src/teams/OrgSettingsPage.tsx +++ b/components/dashboard/src/teams/OrgSettingsPage.tsx @@ -4,7 +4,6 @@ * See License.AGPL.txt in the project root for license information. */ -import { Team } from "@gitpod/gitpod-protocol"; import { BillingMode } from "@gitpod/gitpod-protocol/lib/billing-mode"; import { useMemo } from "react"; import { Redirect } from "react-router"; @@ -12,15 +11,15 @@ import Header from "../components/Header"; import { SpinnerLoader } from "../components/Loader"; import { PageWithSubMenu } from "../components/PageWithSubMenu"; import { useOrgBillingMode } from "../data/billing-mode/org-billing-mode-query"; -import { useCurrentOrg } from "../data/organizations/orgs-query"; import { useFeatureFlag } from "../data/featureflag-query"; +import { useOrgMembersInfoQuery } from "../data/organizations/org-members-info-query"; export interface OrgSettingsPageProps { children: React.ReactNode; } export function OrgSettingsPage({ children }: OrgSettingsPageProps) { - const org = useCurrentOrg(); + const orgMembersInfo = useOrgMembersInfoQuery(); const orgBillingMode = useOrgBillingMode(); const oidcServiceEnabled = useFeatureFlag("oidcServiceEnabled"); const orgGitAuthProviders = useFeatureFlag("orgGitAuthProviders"); @@ -28,20 +27,19 @@ export function OrgSettingsPage({ children }: OrgSettingsPageProps) { const menu = useMemo( () => getTeamSettingsMenu({ - team: org.data, billingMode: orgBillingMode.data, ssoEnabled: oidcServiceEnabled, orgGitAuthProviders, - isOwner: org.data?.isOwner, + isOwner: orgMembersInfo.data?.isOwner, }), - [org.data, orgBillingMode.data, oidcServiceEnabled, orgGitAuthProviders], + [orgMembersInfo.data, orgBillingMode.data, oidcServiceEnabled, orgGitAuthProviders], ); const title = "Organization Settings"; const subtitle = "Manage your organization's settings."; // Render as much of the page as we can in a loading state to avoid content shift - if (org.isLoading || orgBillingMode.isLoading) { + if (orgMembersInfo.isLoading || orgBillingMode.isLoading) { return (
@@ -56,7 +54,7 @@ export function OrgSettingsPage({ children }: OrgSettingsPageProps) { const onlyForOwner = false; // After we've loaded, ensure user is an owner, if not, redirect - if (onlyForOwner && !org.data?.isOwner) { + if (onlyForOwner && !orgMembersInfo.data?.isOwner) { return ; } @@ -68,7 +66,6 @@ export function OrgSettingsPage({ children }: OrgSettingsPageProps) { } function getTeamSettingsMenu(params: { - team?: Team; billingMode?: BillingMode; ssoEnabled?: boolean; orgGitAuthProviders: boolean; diff --git a/components/dashboard/src/teams/TeamSettings.tsx b/components/dashboard/src/teams/TeamSettings.tsx index f67711a39f916e..55f5b2a520d6be 100644 --- a/components/dashboard/src/teams/TeamSettings.tsx +++ b/components/dashboard/src/teams/TeamSettings.tsx @@ -26,10 +26,12 @@ import Modal, { ModalBody, ModalFooter, ModalHeader } from "../components/Modal" import { InputField } from "../components/forms/InputField"; import { InputWithCopy } from "../components/InputWithCopy"; import { ReactComponent as Stack } from "../icons/Stack.svg"; +import { OrgMembersInfo, useOrgMembersInfoQuery } from "../data/organizations/org-members-info-query"; export default function TeamSettingsPage() { const user = useCurrentUser(); const org = useCurrentOrg().data; + const orgMembersInfo = useOrgMembersInfoQuery().data; const invalidateOrgs = useOrganizationsInvalidator(); const [modal, setModal] = useState(false); const [teamNameToDelete, setTeamNameToDelete] = useState(""); @@ -50,7 +52,7 @@ export default function TeamSettingsPage() { const updateTeamInformation = useCallback( async (e: React.FormEvent) => { - if (!org?.isOwner) { + if (!orgMembersInfo?.isOwner) { return; } e.preventDefault(); @@ -67,7 +69,7 @@ export default function TeamSettingsPage() { console.error(error); } }, - [orgFormIsValid, updateOrg, teamName, org], + [orgFormIsValid, updateOrg, teamName, orgMembersInfo?.isOwner], ); const deleteTeam = useCallback(async () => { @@ -104,20 +106,20 @@ export default function TeamSettingsPage() { value={teamName} error={teamNameError.message} onChange={setTeamName} - disabled={!org?.isOwner} + disabled={!orgMembersInfo?.isOwner} onBlur={teamNameError.onBlur} /> - {org?.isOwner && ( + {orgMembersInfo?.isOwner && ( )} - + - {user?.organizationId !== org?.id && org?.isOwner && ( + {user?.organizationId !== org?.id && orgMembersInfo?.isOwner && ( <> Delete Organization @@ -170,8 +172,8 @@ export default function TeamSettingsPage() { ); } -function OrgSettingsForm(props: { org?: OrganizationInfo }) { - const { org } = props; +function OrgSettingsForm(props: { org?: OrganizationInfo; orgMembersInfo?: OrgMembersInfo }) { + const { org, orgMembersInfo } = props; const { data: settings, isLoading } = useOrgSettingsQuery(); const { data: imageInfo } = useDefaultWorkspaceImageQuery(); const updateTeamSettings = useUpdateOrgSettingsMutation(); @@ -183,7 +185,7 @@ function OrgSettingsForm(props: { org?: OrganizationInfo }) { if (!org?.id) { throw new Error("no organization selected"); } - if (!org.isOwner) { + if (!orgMembersInfo?.isOwner) { throw new Error("no organization settings change permission"); } try { @@ -195,7 +197,7 @@ function OrgSettingsForm(props: { org?: OrganizationInfo }) { console.error(error); } }, - [updateTeamSettings, org?.id, org?.isOwner, settings], + [updateTeamSettings, org?.id, orgMembersInfo?.isOwner, settings], ); return ( @@ -225,7 +227,7 @@ function OrgSettingsForm(props: { org?: OrganizationInfo }) { hint="Allow workspaces created within an Organization to share the workspace with any authenticated user." checked={!settings?.workspaceSharingDisabled} onChange={(checked) => handleUpdateTeamSettings({ workspaceSharingDisabled: !checked })} - disabled={isLoading || !org?.isOwner} + disabled={isLoading || !orgMembersInfo?.isOwner} /> Workspace Images @@ -234,7 +236,7 @@ function OrgSettingsForm(props: { org?: OrganizationInfo }) { setShowImageEditModal(true)} diff --git a/components/dashboard/src/teams/git-integrations/GitIntegrationListItem.tsx b/components/dashboard/src/teams/git-integrations/GitIntegrationListItem.tsx index 352f536d5d19c9..5008a1bd596d36 100644 --- a/components/dashboard/src/teams/git-integrations/GitIntegrationListItem.tsx +++ b/components/dashboard/src/teams/git-integrations/GitIntegrationListItem.tsx @@ -11,9 +11,9 @@ import { ContextMenuEntry } from "../../components/ContextMenu"; import { Item, ItemField, ItemFieldContextMenu, ItemFieldIcon } from "../../components/ItemsList"; import { useDeleteOrgAuthProviderMutation } from "../../data/auth-providers/delete-org-auth-provider-mutation"; import { GitIntegrationModal } from "./GitIntegrationModal"; -import { useCurrentOrg } from "../../data/organizations/orgs-query"; import { ModalFooterAlert } from "../../components/Modal"; import { useToast } from "../../components/toasts/Toasts"; +import { useOrgMembersInfoQuery } from "../../data/organizations/org-members-info-query"; type Props = { provider: AuthProviderEntry; @@ -22,10 +22,10 @@ export const GitIntegrationListItem: FunctionComponent = ({ provider }) = const [showEditModal, setShowEditModal] = useState(false); const [showDeleteConfirmation, setShowDeleteConfirmation] = useState(false); const deleteAuthProvider = useDeleteOrgAuthProviderMutation(); - const { data: org } = useCurrentOrg(); + const orgMembersInfo = useOrgMembersInfoQuery().data; const { toast } = useToast(); - const memberCount = org?.members.length ?? 1; + const memberCount = orgMembersInfo?.members.length ?? 1; const menuEntries = useMemo(() => { const result: ContextMenuEntry[] = []; diff --git a/components/dashboard/src/usage/UsageSummary.tsx b/components/dashboard/src/usage/UsageSummary.tsx index cea828a7bff793..f2d390d46bbe23 100644 --- a/components/dashboard/src/usage/UsageSummary.tsx +++ b/components/dashboard/src/usage/UsageSummary.tsx @@ -5,16 +5,16 @@ */ import { FC } from "react"; -import { useCurrentOrg } from "../data/organizations/orgs-query"; import { Subheading } from "../components/typography/headings"; import { Link } from "react-router-dom"; import { useOrgBillingMode } from "../data/billing-mode/org-billing-mode-query"; +import { useOrgMembersInfoQuery } from "../data/organizations/org-members-info-query"; type Props = { creditsUsed?: number; }; export const UsageSummaryData: FC = ({ creditsUsed }) => { - const currentOrg = useCurrentOrg(); + const orgMembersInfo = useOrgMembersInfoQuery().data; const { data: billingMode } = useOrgBillingMode(); return ( @@ -26,7 +26,7 @@ export const UsageSummaryData: FC = ({ creditsUsed }) => { {creditsUsed !== undefined ? creditsUsed.toLocaleString() : "-"}
- {currentOrg.data && currentOrg.data.isOwner && billingMode?.mode === "usage-based" && ( + {orgMembersInfo && orgMembersInfo.isOwner && billingMode?.mode === "usage-based" && (
diff --git a/components/gitpod-protocol/src/attribution.ts b/components/gitpod-protocol/src/attribution.ts index 71ded9b6fe4557..094f3d13babfca 100644 --- a/components/gitpod-protocol/src/attribution.ts +++ b/components/gitpod-protocol/src/attribution.ts @@ -21,7 +21,7 @@ export namespace AttributionId { return { kind: "team", teamId: organizationId }; } - export function create(organization: Organization): AttributionId { + export function create(organization: Pick): AttributionId { return createFromOrganizationId(organization.id); } diff --git a/components/public-api-server/pkg/apiv1/team.go b/components/public-api-server/pkg/apiv1/team.go index c2069c3b30e7f7..f9039e9a3fb235 100644 --- a/components/public-api-server/pkg/apiv1/team.go +++ b/components/public-api-server/pkg/apiv1/team.go @@ -142,6 +142,32 @@ func (s *TeamService) ListTeams(ctx context.Context, req *connect.Request[v1.Lis }), nil } +func (s *TeamService) GetTeamList(ctx context.Context, req *connect.Request[v1.GetTeamListRequest]) (*connect.Response[v1.GetTeamListResponse], error) { + conn, err := getConnection(ctx, s.connectionPool) + if err != nil { + return nil, err + } + + teams, err := conn.GetTeams(ctx) + if err != nil { + log.Extract(ctx).WithError(err).Error("Failed to list teams from server.") + return nil, proxy.ConvertError(err) + } + + results := []*v1.TeamMeta{} + + for _, team := range teams { + results = append(results, &v1.TeamMeta{ + Id: team.ID, + Name: team.Name, + Slug: team.Slug, + }) + } + return connect.NewResponse(&v1.GetTeamListResponse{ + Teams: results, + }), nil +} + func (s *TeamService) DeleteTeam(ctx context.Context, req *connect.Request[v1.DeleteTeamRequest]) (*connect.Response[v1.DeleteTeamResponse], error) { teamID, err := validateTeamID(ctx, req.Msg.GetTeamId()) if err != nil { diff --git a/components/public-api-server/pkg/apiv1/team_test.go b/components/public-api-server/pkg/apiv1/team_test.go index b758484135b601..cf23d1ea57f920 100644 --- a/components/public-api-server/pkg/apiv1/team_test.go +++ b/components/public-api-server/pkg/apiv1/team_test.go @@ -207,6 +207,40 @@ func TestTeamsService_ListTeams(t *testing.T) { }) } +func TestTeamsService_GetTeamList(t *testing.T) { + t.Run("returns teams", func(t *testing.T) { + ctx := context.Background() + serverMock, client := setupTeamService(t) + teams := []*protocol.Team{ + newTeam(&protocol.Team{ + Name: "Team A", + }), + newTeam(&protocol.Team{ + Name: "Team B", + }), + } + + serverMock.EXPECT().GetTeams(gomock.Any()).Return(teams, nil) + + response, err := client.GetTeamList(ctx, connect.NewRequest(&v1.GetTeamListRequest{})) + require.NoError(t, err) + requireEqualProto(t, &v1.GetTeamListResponse{ + Teams: []*v1.TeamMeta{ + { + Id: teams[0].ID, + Name: teams[0].Name, + Slug: teams[0].Slug, + }, + { + Id: teams[1].ID, + Name: teams[1].Name, + Slug: teams[1].Slug, + }, + }, + }, response.Msg) + }) +} + func TestTeamService_GetTeam(t *testing.T) { var ( teamID = uuid.New().String() diff --git a/components/public-api/gitpod/experimental/v1/teams.proto b/components/public-api/gitpod/experimental/v1/teams.proto index 7ffb74d69fbdd2..13d26506229459 100644 --- a/components/public-api/gitpod/experimental/v1/teams.proto +++ b/components/public-api/gitpod/experimental/v1/teams.proto @@ -23,6 +23,17 @@ message Team { TeamInvitation team_invitation = 5; } +message TeamMeta { + // id is a UUID of the Team + string id = 1; + + // name is the name of the Team + string name = 2; + + // slug is the slug of the Team + string slug = 3; +} + message TeamMember { // user_id is the identifier of the user string user_id = 1; @@ -73,6 +84,9 @@ service TeamsService { // ListTeams lists the caller has access to. rpc ListTeams(ListTeamsRequest) returns (ListTeamsResponse) {}; + // GetTeamList lists teams that the caller has access to. + rpc GetTeamList(GetTeamListRequest) returns (GetTeamListResponse) {}; + // DeleteTeam deletes the specified team. rpc DeleteTeam(DeleteTeamRequest) returns (DeleteTeamResponse) {}; @@ -121,6 +135,12 @@ message ListTeamsResponse { repeated Team teams = 1; } +message GetTeamListRequest {} + +message GetTeamListResponse { + repeated TeamMeta teams = 1; +} + message DeleteTeamRequest { // team_id is the ID of the team to delete string team_id = 1; diff --git a/components/public-api/go/experimental/v1/teams.pb.go b/components/public-api/go/experimental/v1/teams.pb.go index 453e1911aa8d8c..c99374d6feb558 100644 --- a/components/public-api/go/experimental/v1/teams.pb.go +++ b/components/public-api/go/experimental/v1/teams.pb.go @@ -162,6 +162,72 @@ func (x *Team) GetTeamInvitation() *TeamInvitation { return nil } +type TeamMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id is a UUID of the Team + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // name is the name of the Team + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // slug is the slug of the Team + Slug string `protobuf:"bytes,3,opt,name=slug,proto3" json:"slug,omitempty"` +} + +func (x *TeamMeta) Reset() { + *x = TeamMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TeamMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamMeta) ProtoMessage() {} + +func (x *TeamMeta) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_experimental_v1_teams_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 TeamMeta.ProtoReflect.Descriptor instead. +func (*TeamMeta) Descriptor() ([]byte, []int) { + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{1} +} + +func (x *TeamMeta) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *TeamMeta) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *TeamMeta) GetSlug() string { + if x != nil { + return x.Slug + } + return "" +} + type TeamMember struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -186,7 +252,7 @@ type TeamMember struct { func (x *TeamMember) Reset() { *x = TeamMember{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[1] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -199,7 +265,7 @@ func (x *TeamMember) String() string { func (*TeamMember) ProtoMessage() {} func (x *TeamMember) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[1] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -212,7 +278,7 @@ func (x *TeamMember) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamMember.ProtoReflect.Descriptor instead. func (*TeamMember) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{1} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{2} } func (x *TeamMember) GetUserId() string { @@ -276,7 +342,7 @@ type TeamInvitation struct { func (x *TeamInvitation) Reset() { *x = TeamInvitation{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[2] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -289,7 +355,7 @@ func (x *TeamInvitation) String() string { func (*TeamInvitation) ProtoMessage() {} func (x *TeamInvitation) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[2] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -302,7 +368,7 @@ func (x *TeamInvitation) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamInvitation.ProtoReflect.Descriptor instead. func (*TeamInvitation) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{2} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{3} } func (x *TeamInvitation) GetId() string { @@ -324,7 +390,7 @@ type CreateTeamRequest struct { func (x *CreateTeamRequest) Reset() { *x = CreateTeamRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[3] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -337,7 +403,7 @@ func (x *CreateTeamRequest) String() string { func (*CreateTeamRequest) ProtoMessage() {} func (x *CreateTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[3] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -350,7 +416,7 @@ func (x *CreateTeamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTeamRequest.ProtoReflect.Descriptor instead. func (*CreateTeamRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{3} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{4} } func (x *CreateTeamRequest) GetName() string { @@ -371,7 +437,7 @@ type CreateTeamResponse struct { func (x *CreateTeamResponse) Reset() { *x = CreateTeamResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[4] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -384,7 +450,7 @@ func (x *CreateTeamResponse) String() string { func (*CreateTeamResponse) ProtoMessage() {} func (x *CreateTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[4] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -397,7 +463,7 @@ func (x *CreateTeamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTeamResponse.ProtoReflect.Descriptor instead. func (*CreateTeamResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{4} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{5} } func (x *CreateTeamResponse) GetTeam() *Team { @@ -419,7 +485,7 @@ type GetTeamRequest struct { func (x *GetTeamRequest) Reset() { *x = GetTeamRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[5] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -432,7 +498,7 @@ func (x *GetTeamRequest) String() string { func (*GetTeamRequest) ProtoMessage() {} func (x *GetTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[5] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -445,7 +511,7 @@ func (x *GetTeamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTeamRequest.ProtoReflect.Descriptor instead. func (*GetTeamRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{5} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{6} } func (x *GetTeamRequest) GetTeamId() string { @@ -466,7 +532,7 @@ type GetTeamResponse struct { func (x *GetTeamResponse) Reset() { *x = GetTeamResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[6] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -479,7 +545,7 @@ func (x *GetTeamResponse) String() string { func (*GetTeamResponse) ProtoMessage() {} func (x *GetTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[6] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -492,7 +558,7 @@ func (x *GetTeamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTeamResponse.ProtoReflect.Descriptor instead. func (*GetTeamResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{6} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{7} } func (x *GetTeamResponse) GetTeam() *Team { @@ -511,7 +577,7 @@ type ListTeamsRequest struct { func (x *ListTeamsRequest) Reset() { *x = ListTeamsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[7] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -524,7 +590,7 @@ func (x *ListTeamsRequest) String() string { func (*ListTeamsRequest) ProtoMessage() {} func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[7] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -537,7 +603,7 @@ func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamsRequest.ProtoReflect.Descriptor instead. func (*ListTeamsRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{7} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{8} } type ListTeamsResponse struct { @@ -551,7 +617,7 @@ type ListTeamsResponse struct { func (x *ListTeamsResponse) Reset() { *x = ListTeamsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[8] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -564,7 +630,7 @@ func (x *ListTeamsResponse) String() string { func (*ListTeamsResponse) ProtoMessage() {} func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[8] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -577,7 +643,7 @@ func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamsResponse.ProtoReflect.Descriptor instead. func (*ListTeamsResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{8} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{9} } func (x *ListTeamsResponse) GetTeams() []*Team { @@ -587,6 +653,91 @@ func (x *ListTeamsResponse) GetTeams() []*Team { return nil } +type GetTeamListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetTeamListRequest) Reset() { + *x = GetTeamListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTeamListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTeamListRequest) ProtoMessage() {} + +func (x *GetTeamListRequest) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[10] + 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 GetTeamListRequest.ProtoReflect.Descriptor instead. +func (*GetTeamListRequest) Descriptor() ([]byte, []int) { + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{10} +} + +type GetTeamListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Teams []*TeamMeta `protobuf:"bytes,1,rep,name=teams,proto3" json:"teams,omitempty"` +} + +func (x *GetTeamListResponse) Reset() { + *x = GetTeamListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTeamListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTeamListResponse) ProtoMessage() {} + +func (x *GetTeamListResponse) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[11] + 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 GetTeamListResponse.ProtoReflect.Descriptor instead. +func (*GetTeamListResponse) Descriptor() ([]byte, []int) { + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{11} +} + +func (x *GetTeamListResponse) GetTeams() []*TeamMeta { + if x != nil { + return x.Teams + } + return nil +} + type DeleteTeamRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -599,7 +750,7 @@ type DeleteTeamRequest struct { func (x *DeleteTeamRequest) Reset() { *x = DeleteTeamRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[9] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -612,7 +763,7 @@ func (x *DeleteTeamRequest) String() string { func (*DeleteTeamRequest) ProtoMessage() {} func (x *DeleteTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[9] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -625,7 +776,7 @@ func (x *DeleteTeamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTeamRequest.ProtoReflect.Descriptor instead. func (*DeleteTeamRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{9} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{12} } func (x *DeleteTeamRequest) GetTeamId() string { @@ -644,7 +795,7 @@ type DeleteTeamResponse struct { func (x *DeleteTeamResponse) Reset() { *x = DeleteTeamResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[10] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -657,7 +808,7 @@ func (x *DeleteTeamResponse) String() string { func (*DeleteTeamResponse) ProtoMessage() {} func (x *DeleteTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[10] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -670,7 +821,7 @@ func (x *DeleteTeamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTeamResponse.ProtoReflect.Descriptor instead. func (*DeleteTeamResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{10} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{13} } type GetTeamInvitationRequest struct { @@ -684,7 +835,7 @@ type GetTeamInvitationRequest struct { func (x *GetTeamInvitationRequest) Reset() { *x = GetTeamInvitationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[11] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -697,7 +848,7 @@ func (x *GetTeamInvitationRequest) String() string { func (*GetTeamInvitationRequest) ProtoMessage() {} func (x *GetTeamInvitationRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[11] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -710,7 +861,7 @@ func (x *GetTeamInvitationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTeamInvitationRequest.ProtoReflect.Descriptor instead. func (*GetTeamInvitationRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{11} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{14} } func (x *GetTeamInvitationRequest) GetTeamId() string { @@ -732,7 +883,7 @@ type GetTeamInvitationResponse struct { func (x *GetTeamInvitationResponse) Reset() { *x = GetTeamInvitationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[12] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -745,7 +896,7 @@ func (x *GetTeamInvitationResponse) String() string { func (*GetTeamInvitationResponse) ProtoMessage() {} func (x *GetTeamInvitationResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[12] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -758,7 +909,7 @@ func (x *GetTeamInvitationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTeamInvitationResponse.ProtoReflect.Descriptor instead. func (*GetTeamInvitationResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{12} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{15} } func (x *GetTeamInvitationResponse) GetTeamInvitation() *TeamInvitation { @@ -780,7 +931,7 @@ type JoinTeamRequest struct { func (x *JoinTeamRequest) Reset() { *x = JoinTeamRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[13] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -793,7 +944,7 @@ func (x *JoinTeamRequest) String() string { func (*JoinTeamRequest) ProtoMessage() {} func (x *JoinTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[13] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -806,7 +957,7 @@ func (x *JoinTeamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use JoinTeamRequest.ProtoReflect.Descriptor instead. func (*JoinTeamRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{13} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{16} } func (x *JoinTeamRequest) GetInvitationId() string { @@ -828,7 +979,7 @@ type JoinTeamResponse struct { func (x *JoinTeamResponse) Reset() { *x = JoinTeamResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[14] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -841,7 +992,7 @@ func (x *JoinTeamResponse) String() string { func (*JoinTeamResponse) ProtoMessage() {} func (x *JoinTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[14] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -854,7 +1005,7 @@ func (x *JoinTeamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use JoinTeamResponse.ProtoReflect.Descriptor instead. func (*JoinTeamResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{14} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{17} } func (x *JoinTeamResponse) GetTeam() *Team { @@ -875,7 +1026,7 @@ type ResetTeamInvitationRequest struct { func (x *ResetTeamInvitationRequest) Reset() { *x = ResetTeamInvitationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[15] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -888,7 +1039,7 @@ func (x *ResetTeamInvitationRequest) String() string { func (*ResetTeamInvitationRequest) ProtoMessage() {} func (x *ResetTeamInvitationRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[15] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -901,7 +1052,7 @@ func (x *ResetTeamInvitationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetTeamInvitationRequest.ProtoReflect.Descriptor instead. func (*ResetTeamInvitationRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{15} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{18} } func (x *ResetTeamInvitationRequest) GetTeamId() string { @@ -923,7 +1074,7 @@ type ResetTeamInvitationResponse struct { func (x *ResetTeamInvitationResponse) Reset() { *x = ResetTeamInvitationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[16] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -936,7 +1087,7 @@ func (x *ResetTeamInvitationResponse) String() string { func (*ResetTeamInvitationResponse) ProtoMessage() {} func (x *ResetTeamInvitationResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[16] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -949,7 +1100,7 @@ func (x *ResetTeamInvitationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetTeamInvitationResponse.ProtoReflect.Descriptor instead. func (*ResetTeamInvitationResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{16} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{19} } func (x *ResetTeamInvitationResponse) GetTeamInvitation() *TeamInvitation { @@ -971,7 +1122,7 @@ type ListTeamMembersRequest struct { func (x *ListTeamMembersRequest) Reset() { *x = ListTeamMembersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[17] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -984,7 +1135,7 @@ func (x *ListTeamMembersRequest) String() string { func (*ListTeamMembersRequest) ProtoMessage() {} func (x *ListTeamMembersRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[17] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -997,7 +1148,7 @@ func (x *ListTeamMembersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamMembersRequest.ProtoReflect.Descriptor instead. func (*ListTeamMembersRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{17} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{20} } func (x *ListTeamMembersRequest) GetTeamId() string { @@ -1019,7 +1170,7 @@ type ListTeamMembersResponse struct { func (x *ListTeamMembersResponse) Reset() { *x = ListTeamMembersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[18] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1032,7 +1183,7 @@ func (x *ListTeamMembersResponse) String() string { func (*ListTeamMembersResponse) ProtoMessage() {} func (x *ListTeamMembersResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[18] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1045,7 +1196,7 @@ func (x *ListTeamMembersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamMembersResponse.ProtoReflect.Descriptor instead. func (*ListTeamMembersResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{18} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{21} } func (x *ListTeamMembersResponse) GetMembers() []*TeamMember { @@ -1069,7 +1220,7 @@ type UpdateTeamMemberRequest struct { func (x *UpdateTeamMemberRequest) Reset() { *x = UpdateTeamMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[19] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1082,7 +1233,7 @@ func (x *UpdateTeamMemberRequest) String() string { func (*UpdateTeamMemberRequest) ProtoMessage() {} func (x *UpdateTeamMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[19] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1095,7 +1246,7 @@ func (x *UpdateTeamMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTeamMemberRequest.ProtoReflect.Descriptor instead. func (*UpdateTeamMemberRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{19} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{22} } func (x *UpdateTeamMemberRequest) GetTeamId() string { @@ -1123,7 +1274,7 @@ type UpdateTeamMemberResponse struct { func (x *UpdateTeamMemberResponse) Reset() { *x = UpdateTeamMemberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[20] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1136,7 +1287,7 @@ func (x *UpdateTeamMemberResponse) String() string { func (*UpdateTeamMemberResponse) ProtoMessage() {} func (x *UpdateTeamMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[20] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1149,7 +1300,7 @@ func (x *UpdateTeamMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTeamMemberResponse.ProtoReflect.Descriptor instead. func (*UpdateTeamMemberResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{20} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{23} } func (x *UpdateTeamMemberResponse) GetTeamMember() *TeamMember { @@ -1173,7 +1324,7 @@ type DeleteTeamMemberRequest struct { func (x *DeleteTeamMemberRequest) Reset() { *x = DeleteTeamMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[21] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1186,7 +1337,7 @@ func (x *DeleteTeamMemberRequest) String() string { func (*DeleteTeamMemberRequest) ProtoMessage() {} func (x *DeleteTeamMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[21] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1199,7 +1350,7 @@ func (x *DeleteTeamMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTeamMemberRequest.ProtoReflect.Descriptor instead. func (*DeleteTeamMemberRequest) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{21} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{24} } func (x *DeleteTeamMemberRequest) GetTeamId() string { @@ -1225,7 +1376,7 @@ type DeleteTeamMemberResponse struct { func (x *DeleteTeamMemberResponse) Reset() { *x = DeleteTeamMemberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[22] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1238,7 +1389,7 @@ func (x *DeleteTeamMemberResponse) String() string { func (*DeleteTeamMemberResponse) ProtoMessage() {} func (x *DeleteTeamMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[22] + mi := &file_gitpod_experimental_v1_teams_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1251,7 +1402,7 @@ func (x *DeleteTeamMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTeamMemberResponse.ProtoReflect.Descriptor instead. func (*DeleteTeamMemberResponse) Descriptor() ([]byte, []int) { - return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{22} + return file_gitpod_experimental_v1_teams_proto_rawDescGZIP(), []int{25} } var File_gitpod_experimental_v1_teams_proto protoreflect.FileDescriptor @@ -1275,192 +1426,209 @@ var file_gitpod_experimental_v1_teams_proto_rawDesc = []byte{ 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xaf, 0x02, - 0x0a, 0x0a, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, - 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, - 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, - 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x32, 0x0a, 0x15, 0x6f, - 0x77, 0x6e, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6f, 0x77, 0x6e, 0x65, - 0x64, 0x42, 0x79, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x20, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x22, 0x27, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x12, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x30, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, - 0x61, 0x6d, 0x22, 0x29, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x43, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x30, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, + 0x08, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x74, 0x61, 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, 0x12, 0x0a, + 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, + 0x67, 0x22, 0xaf, 0x02, 0x0a, 0x0a, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x6f, 0x6c, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, + 0x3d, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, + 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x32, 0x0a, 0x15, 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x42, 0x79, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x27, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x46, + 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x29, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x11, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x32, 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, - 0x61, 0x6d, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x74, - 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, - 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x22, - 0x2c, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x14, 0x0a, - 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, - 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x6e, - 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x36, 0x0a, 0x0f, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x76, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x44, - 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, - 0x74, 0x65, 0x61, 0x6d, 0x22, 0x35, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x65, 0x74, 0x54, 0x65, 0x61, - 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x6e, 0x0a, 0x1b, 0x52, - 0x65, 0x73, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, + 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, 0x74, 0x65, + 0x61, 0x6d, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4d, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x36, 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x74, + 0x61, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x2c, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x22, 0x6c, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, + 0x0a, 0x0f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0e, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x36, 0x0a, 0x0f, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, + 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x35, 0x0a, + 0x1a, 0x52, 0x65, 0x73, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x22, 0x6e, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x6e, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x57, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, - 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x16, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x57, - 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x69, 0x74, + 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x22, 0x77, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0b, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x0a, 0x74, + 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x5f, 0x0a, 0x18, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x07, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x77, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0b, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x0a, 0x74, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x22, 0x5f, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0b, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x0a, 0x74, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x58, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, - 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x50, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x52, - 0x6f, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x52, 0x4f, 0x4c, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, - 0x0a, 0x0f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4f, 0x57, 0x4e, 0x45, - 0x52, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x52, 0x4f, 0x4c, 0x45, - 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x32, 0xe6, 0x08, 0x0a, 0x0c, 0x54, 0x65, - 0x61, 0x6d, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x65, 0x0a, 0x0a, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x26, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x62, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x0a, + 0x74, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x58, 0x0a, 0x17, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, + 0x0a, 0x0e, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x49, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, + 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2a, 0x50, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x15, + 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x45, 0x41, 0x4d, 0x5f, + 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, + 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, + 0x10, 0x02, 0x32, 0xd0, 0x09, 0x0a, 0x0c, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x65, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, - 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x08, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, - 0x61, 0x6d, 0x12, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, - 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, - 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x65, - 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x32, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0f, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x77, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x10, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2f, 0x2e, + 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, - 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, + 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x54, 0x65, 0x61, 0x6d, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, + 0x11, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x08, 0x4a, 0x6f, 0x69, + 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4a, + 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, - 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x52, + 0x65, 0x73, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x32, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, + 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x12, 0x2e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, + 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x10, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1476,73 +1644,79 @@ func file_gitpod_experimental_v1_teams_proto_rawDescGZIP() []byte { } var file_gitpod_experimental_v1_teams_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_gitpod_experimental_v1_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_gitpod_experimental_v1_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_gitpod_experimental_v1_teams_proto_goTypes = []interface{}{ (TeamRole)(0), // 0: gitpod.experimental.v1.TeamRole (*Team)(nil), // 1: gitpod.experimental.v1.Team - (*TeamMember)(nil), // 2: gitpod.experimental.v1.TeamMember - (*TeamInvitation)(nil), // 3: gitpod.experimental.v1.TeamInvitation - (*CreateTeamRequest)(nil), // 4: gitpod.experimental.v1.CreateTeamRequest - (*CreateTeamResponse)(nil), // 5: gitpod.experimental.v1.CreateTeamResponse - (*GetTeamRequest)(nil), // 6: gitpod.experimental.v1.GetTeamRequest - (*GetTeamResponse)(nil), // 7: gitpod.experimental.v1.GetTeamResponse - (*ListTeamsRequest)(nil), // 8: gitpod.experimental.v1.ListTeamsRequest - (*ListTeamsResponse)(nil), // 9: gitpod.experimental.v1.ListTeamsResponse - (*DeleteTeamRequest)(nil), // 10: gitpod.experimental.v1.DeleteTeamRequest - (*DeleteTeamResponse)(nil), // 11: gitpod.experimental.v1.DeleteTeamResponse - (*GetTeamInvitationRequest)(nil), // 12: gitpod.experimental.v1.GetTeamInvitationRequest - (*GetTeamInvitationResponse)(nil), // 13: gitpod.experimental.v1.GetTeamInvitationResponse - (*JoinTeamRequest)(nil), // 14: gitpod.experimental.v1.JoinTeamRequest - (*JoinTeamResponse)(nil), // 15: gitpod.experimental.v1.JoinTeamResponse - (*ResetTeamInvitationRequest)(nil), // 16: gitpod.experimental.v1.ResetTeamInvitationRequest - (*ResetTeamInvitationResponse)(nil), // 17: gitpod.experimental.v1.ResetTeamInvitationResponse - (*ListTeamMembersRequest)(nil), // 18: gitpod.experimental.v1.ListTeamMembersRequest - (*ListTeamMembersResponse)(nil), // 19: gitpod.experimental.v1.ListTeamMembersResponse - (*UpdateTeamMemberRequest)(nil), // 20: gitpod.experimental.v1.UpdateTeamMemberRequest - (*UpdateTeamMemberResponse)(nil), // 21: gitpod.experimental.v1.UpdateTeamMemberResponse - (*DeleteTeamMemberRequest)(nil), // 22: gitpod.experimental.v1.DeleteTeamMemberRequest - (*DeleteTeamMemberResponse)(nil), // 23: gitpod.experimental.v1.DeleteTeamMemberResponse - (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp + (*TeamMeta)(nil), // 2: gitpod.experimental.v1.TeamMeta + (*TeamMember)(nil), // 3: gitpod.experimental.v1.TeamMember + (*TeamInvitation)(nil), // 4: gitpod.experimental.v1.TeamInvitation + (*CreateTeamRequest)(nil), // 5: gitpod.experimental.v1.CreateTeamRequest + (*CreateTeamResponse)(nil), // 6: gitpod.experimental.v1.CreateTeamResponse + (*GetTeamRequest)(nil), // 7: gitpod.experimental.v1.GetTeamRequest + (*GetTeamResponse)(nil), // 8: gitpod.experimental.v1.GetTeamResponse + (*ListTeamsRequest)(nil), // 9: gitpod.experimental.v1.ListTeamsRequest + (*ListTeamsResponse)(nil), // 10: gitpod.experimental.v1.ListTeamsResponse + (*GetTeamListRequest)(nil), // 11: gitpod.experimental.v1.GetTeamListRequest + (*GetTeamListResponse)(nil), // 12: gitpod.experimental.v1.GetTeamListResponse + (*DeleteTeamRequest)(nil), // 13: gitpod.experimental.v1.DeleteTeamRequest + (*DeleteTeamResponse)(nil), // 14: gitpod.experimental.v1.DeleteTeamResponse + (*GetTeamInvitationRequest)(nil), // 15: gitpod.experimental.v1.GetTeamInvitationRequest + (*GetTeamInvitationResponse)(nil), // 16: gitpod.experimental.v1.GetTeamInvitationResponse + (*JoinTeamRequest)(nil), // 17: gitpod.experimental.v1.JoinTeamRequest + (*JoinTeamResponse)(nil), // 18: gitpod.experimental.v1.JoinTeamResponse + (*ResetTeamInvitationRequest)(nil), // 19: gitpod.experimental.v1.ResetTeamInvitationRequest + (*ResetTeamInvitationResponse)(nil), // 20: gitpod.experimental.v1.ResetTeamInvitationResponse + (*ListTeamMembersRequest)(nil), // 21: gitpod.experimental.v1.ListTeamMembersRequest + (*ListTeamMembersResponse)(nil), // 22: gitpod.experimental.v1.ListTeamMembersResponse + (*UpdateTeamMemberRequest)(nil), // 23: gitpod.experimental.v1.UpdateTeamMemberRequest + (*UpdateTeamMemberResponse)(nil), // 24: gitpod.experimental.v1.UpdateTeamMemberResponse + (*DeleteTeamMemberRequest)(nil), // 25: gitpod.experimental.v1.DeleteTeamMemberRequest + (*DeleteTeamMemberResponse)(nil), // 26: gitpod.experimental.v1.DeleteTeamMemberResponse + (*timestamppb.Timestamp)(nil), // 27: google.protobuf.Timestamp } var file_gitpod_experimental_v1_teams_proto_depIdxs = []int32{ - 2, // 0: gitpod.experimental.v1.Team.members:type_name -> gitpod.experimental.v1.TeamMember - 3, // 1: gitpod.experimental.v1.Team.team_invitation:type_name -> gitpod.experimental.v1.TeamInvitation + 3, // 0: gitpod.experimental.v1.Team.members:type_name -> gitpod.experimental.v1.TeamMember + 4, // 1: gitpod.experimental.v1.Team.team_invitation:type_name -> gitpod.experimental.v1.TeamInvitation 0, // 2: gitpod.experimental.v1.TeamMember.role:type_name -> gitpod.experimental.v1.TeamRole - 24, // 3: gitpod.experimental.v1.TeamMember.member_since:type_name -> google.protobuf.Timestamp + 27, // 3: gitpod.experimental.v1.TeamMember.member_since:type_name -> google.protobuf.Timestamp 1, // 4: gitpod.experimental.v1.CreateTeamResponse.team:type_name -> gitpod.experimental.v1.Team 1, // 5: gitpod.experimental.v1.GetTeamResponse.team:type_name -> gitpod.experimental.v1.Team 1, // 6: gitpod.experimental.v1.ListTeamsResponse.teams:type_name -> gitpod.experimental.v1.Team - 3, // 7: gitpod.experimental.v1.GetTeamInvitationResponse.team_invitation:type_name -> gitpod.experimental.v1.TeamInvitation - 1, // 8: gitpod.experimental.v1.JoinTeamResponse.team:type_name -> gitpod.experimental.v1.Team - 3, // 9: gitpod.experimental.v1.ResetTeamInvitationResponse.team_invitation:type_name -> gitpod.experimental.v1.TeamInvitation - 2, // 10: gitpod.experimental.v1.ListTeamMembersResponse.members:type_name -> gitpod.experimental.v1.TeamMember - 2, // 11: gitpod.experimental.v1.UpdateTeamMemberRequest.team_member:type_name -> gitpod.experimental.v1.TeamMember - 2, // 12: gitpod.experimental.v1.UpdateTeamMemberResponse.team_member:type_name -> gitpod.experimental.v1.TeamMember - 4, // 13: gitpod.experimental.v1.TeamsService.CreateTeam:input_type -> gitpod.experimental.v1.CreateTeamRequest - 6, // 14: gitpod.experimental.v1.TeamsService.GetTeam:input_type -> gitpod.experimental.v1.GetTeamRequest - 8, // 15: gitpod.experimental.v1.TeamsService.ListTeams:input_type -> gitpod.experimental.v1.ListTeamsRequest - 10, // 16: gitpod.experimental.v1.TeamsService.DeleteTeam:input_type -> gitpod.experimental.v1.DeleteTeamRequest - 12, // 17: gitpod.experimental.v1.TeamsService.GetTeamInvitation:input_type -> gitpod.experimental.v1.GetTeamInvitationRequest - 14, // 18: gitpod.experimental.v1.TeamsService.JoinTeam:input_type -> gitpod.experimental.v1.JoinTeamRequest - 16, // 19: gitpod.experimental.v1.TeamsService.ResetTeamInvitation:input_type -> gitpod.experimental.v1.ResetTeamInvitationRequest - 18, // 20: gitpod.experimental.v1.TeamsService.ListTeamMembers:input_type -> gitpod.experimental.v1.ListTeamMembersRequest - 20, // 21: gitpod.experimental.v1.TeamsService.UpdateTeamMember:input_type -> gitpod.experimental.v1.UpdateTeamMemberRequest - 22, // 22: gitpod.experimental.v1.TeamsService.DeleteTeamMember:input_type -> gitpod.experimental.v1.DeleteTeamMemberRequest - 5, // 23: gitpod.experimental.v1.TeamsService.CreateTeam:output_type -> gitpod.experimental.v1.CreateTeamResponse - 7, // 24: gitpod.experimental.v1.TeamsService.GetTeam:output_type -> gitpod.experimental.v1.GetTeamResponse - 9, // 25: gitpod.experimental.v1.TeamsService.ListTeams:output_type -> gitpod.experimental.v1.ListTeamsResponse - 11, // 26: gitpod.experimental.v1.TeamsService.DeleteTeam:output_type -> gitpod.experimental.v1.DeleteTeamResponse - 13, // 27: gitpod.experimental.v1.TeamsService.GetTeamInvitation:output_type -> gitpod.experimental.v1.GetTeamInvitationResponse - 15, // 28: gitpod.experimental.v1.TeamsService.JoinTeam:output_type -> gitpod.experimental.v1.JoinTeamResponse - 17, // 29: gitpod.experimental.v1.TeamsService.ResetTeamInvitation:output_type -> gitpod.experimental.v1.ResetTeamInvitationResponse - 19, // 30: gitpod.experimental.v1.TeamsService.ListTeamMembers:output_type -> gitpod.experimental.v1.ListTeamMembersResponse - 21, // 31: gitpod.experimental.v1.TeamsService.UpdateTeamMember:output_type -> gitpod.experimental.v1.UpdateTeamMemberResponse - 23, // 32: gitpod.experimental.v1.TeamsService.DeleteTeamMember:output_type -> gitpod.experimental.v1.DeleteTeamMemberResponse - 23, // [23:33] is the sub-list for method output_type - 13, // [13:23] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 2, // 7: gitpod.experimental.v1.GetTeamListResponse.teams:type_name -> gitpod.experimental.v1.TeamMeta + 4, // 8: gitpod.experimental.v1.GetTeamInvitationResponse.team_invitation:type_name -> gitpod.experimental.v1.TeamInvitation + 1, // 9: gitpod.experimental.v1.JoinTeamResponse.team:type_name -> gitpod.experimental.v1.Team + 4, // 10: gitpod.experimental.v1.ResetTeamInvitationResponse.team_invitation:type_name -> gitpod.experimental.v1.TeamInvitation + 3, // 11: gitpod.experimental.v1.ListTeamMembersResponse.members:type_name -> gitpod.experimental.v1.TeamMember + 3, // 12: gitpod.experimental.v1.UpdateTeamMemberRequest.team_member:type_name -> gitpod.experimental.v1.TeamMember + 3, // 13: gitpod.experimental.v1.UpdateTeamMemberResponse.team_member:type_name -> gitpod.experimental.v1.TeamMember + 5, // 14: gitpod.experimental.v1.TeamsService.CreateTeam:input_type -> gitpod.experimental.v1.CreateTeamRequest + 7, // 15: gitpod.experimental.v1.TeamsService.GetTeam:input_type -> gitpod.experimental.v1.GetTeamRequest + 9, // 16: gitpod.experimental.v1.TeamsService.ListTeams:input_type -> gitpod.experimental.v1.ListTeamsRequest + 11, // 17: gitpod.experimental.v1.TeamsService.GetTeamList:input_type -> gitpod.experimental.v1.GetTeamListRequest + 13, // 18: gitpod.experimental.v1.TeamsService.DeleteTeam:input_type -> gitpod.experimental.v1.DeleteTeamRequest + 15, // 19: gitpod.experimental.v1.TeamsService.GetTeamInvitation:input_type -> gitpod.experimental.v1.GetTeamInvitationRequest + 17, // 20: gitpod.experimental.v1.TeamsService.JoinTeam:input_type -> gitpod.experimental.v1.JoinTeamRequest + 19, // 21: gitpod.experimental.v1.TeamsService.ResetTeamInvitation:input_type -> gitpod.experimental.v1.ResetTeamInvitationRequest + 21, // 22: gitpod.experimental.v1.TeamsService.ListTeamMembers:input_type -> gitpod.experimental.v1.ListTeamMembersRequest + 23, // 23: gitpod.experimental.v1.TeamsService.UpdateTeamMember:input_type -> gitpod.experimental.v1.UpdateTeamMemberRequest + 25, // 24: gitpod.experimental.v1.TeamsService.DeleteTeamMember:input_type -> gitpod.experimental.v1.DeleteTeamMemberRequest + 6, // 25: gitpod.experimental.v1.TeamsService.CreateTeam:output_type -> gitpod.experimental.v1.CreateTeamResponse + 8, // 26: gitpod.experimental.v1.TeamsService.GetTeam:output_type -> gitpod.experimental.v1.GetTeamResponse + 10, // 27: gitpod.experimental.v1.TeamsService.ListTeams:output_type -> gitpod.experimental.v1.ListTeamsResponse + 12, // 28: gitpod.experimental.v1.TeamsService.GetTeamList:output_type -> gitpod.experimental.v1.GetTeamListResponse + 14, // 29: gitpod.experimental.v1.TeamsService.DeleteTeam:output_type -> gitpod.experimental.v1.DeleteTeamResponse + 16, // 30: gitpod.experimental.v1.TeamsService.GetTeamInvitation:output_type -> gitpod.experimental.v1.GetTeamInvitationResponse + 18, // 31: gitpod.experimental.v1.TeamsService.JoinTeam:output_type -> gitpod.experimental.v1.JoinTeamResponse + 20, // 32: gitpod.experimental.v1.TeamsService.ResetTeamInvitation:output_type -> gitpod.experimental.v1.ResetTeamInvitationResponse + 22, // 33: gitpod.experimental.v1.TeamsService.ListTeamMembers:output_type -> gitpod.experimental.v1.ListTeamMembersResponse + 24, // 34: gitpod.experimental.v1.TeamsService.UpdateTeamMember:output_type -> gitpod.experimental.v1.UpdateTeamMemberResponse + 26, // 35: gitpod.experimental.v1.TeamsService.DeleteTeamMember:output_type -> gitpod.experimental.v1.DeleteTeamMemberResponse + 25, // [25:36] is the sub-list for method output_type + 14, // [14:25] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_gitpod_experimental_v1_teams_proto_init() } @@ -1564,7 +1738,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamMember); i { + switch v := v.(*TeamMeta); i { case 0: return &v.state case 1: @@ -1576,7 +1750,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamInvitation); i { + switch v := v.(*TeamMember); i { case 0: return &v.state case 1: @@ -1588,7 +1762,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTeamRequest); i { + switch v := v.(*TeamInvitation); i { case 0: return &v.state case 1: @@ -1600,7 +1774,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTeamResponse); i { + switch v := v.(*CreateTeamRequest); i { case 0: return &v.state case 1: @@ -1612,7 +1786,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTeamRequest); i { + switch v := v.(*CreateTeamResponse); i { case 0: return &v.state case 1: @@ -1624,7 +1798,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTeamResponse); i { + switch v := v.(*GetTeamRequest); i { case 0: return &v.state case 1: @@ -1636,7 +1810,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTeamsRequest); i { + switch v := v.(*GetTeamResponse); i { case 0: return &v.state case 1: @@ -1648,7 +1822,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTeamsResponse); i { + switch v := v.(*ListTeamsRequest); i { case 0: return &v.state case 1: @@ -1660,7 +1834,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTeamRequest); i { + switch v := v.(*ListTeamsResponse); i { case 0: return &v.state case 1: @@ -1672,7 +1846,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTeamResponse); i { + switch v := v.(*GetTeamListRequest); i { case 0: return &v.state case 1: @@ -1684,7 +1858,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTeamInvitationRequest); i { + switch v := v.(*GetTeamListResponse); i { case 0: return &v.state case 1: @@ -1696,7 +1870,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTeamInvitationResponse); i { + switch v := v.(*DeleteTeamRequest); i { case 0: return &v.state case 1: @@ -1708,7 +1882,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinTeamRequest); i { + switch v := v.(*DeleteTeamResponse); i { case 0: return &v.state case 1: @@ -1720,7 +1894,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinTeamResponse); i { + switch v := v.(*GetTeamInvitationRequest); i { case 0: return &v.state case 1: @@ -1732,7 +1906,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetTeamInvitationRequest); i { + switch v := v.(*GetTeamInvitationResponse); i { case 0: return &v.state case 1: @@ -1744,7 +1918,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetTeamInvitationResponse); i { + switch v := v.(*JoinTeamRequest); i { case 0: return &v.state case 1: @@ -1756,7 +1930,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTeamMembersRequest); i { + switch v := v.(*JoinTeamResponse); i { case 0: return &v.state case 1: @@ -1768,7 +1942,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTeamMembersResponse); i { + switch v := v.(*ResetTeamInvitationRequest); i { case 0: return &v.state case 1: @@ -1780,7 +1954,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateTeamMemberRequest); i { + switch v := v.(*ResetTeamInvitationResponse); i { case 0: return &v.state case 1: @@ -1792,7 +1966,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateTeamMemberResponse); i { + switch v := v.(*ListTeamMembersRequest); i { case 0: return &v.state case 1: @@ -1804,7 +1978,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTeamMemberRequest); i { + switch v := v.(*ListTeamMembersResponse); i { case 0: return &v.state case 1: @@ -1816,6 +1990,42 @@ func file_gitpod_experimental_v1_teams_proto_init() { } } file_gitpod_experimental_v1_teams_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateTeamMemberRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_experimental_v1_teams_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateTeamMemberResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_experimental_v1_teams_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteTeamMemberRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_experimental_v1_teams_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteTeamMemberResponse); i { case 0: return &v.state @@ -1834,7 +2044,7 @@ func file_gitpod_experimental_v1_teams_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gitpod_experimental_v1_teams_proto_rawDesc, NumEnums: 1, - NumMessages: 23, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/components/public-api/go/experimental/v1/teams_grpc.pb.go b/components/public-api/go/experimental/v1/teams_grpc.pb.go index 18c0ca70b0fa0d..22e1b40e247d18 100644 --- a/components/public-api/go/experimental/v1/teams_grpc.pb.go +++ b/components/public-api/go/experimental/v1/teams_grpc.pb.go @@ -32,6 +32,8 @@ type TeamsServiceClient interface { GetTeam(ctx context.Context, in *GetTeamRequest, opts ...grpc.CallOption) (*GetTeamResponse, error) // ListTeams lists the caller has access to. ListTeams(ctx context.Context, in *ListTeamsRequest, opts ...grpc.CallOption) (*ListTeamsResponse, error) + // GetTeamList lists teams that the caller has access to. + GetTeamList(ctx context.Context, in *GetTeamListRequest, opts ...grpc.CallOption) (*GetTeamListResponse, error) // DeleteTeam deletes the specified team. DeleteTeam(ctx context.Context, in *DeleteTeamRequest, opts ...grpc.CallOption) (*DeleteTeamResponse, error) // GetTeamInvitation retrieves the invitation for a Team. @@ -83,6 +85,15 @@ func (c *teamsServiceClient) ListTeams(ctx context.Context, in *ListTeamsRequest return out, nil } +func (c *teamsServiceClient) GetTeamList(ctx context.Context, in *GetTeamListRequest, opts ...grpc.CallOption) (*GetTeamListResponse, error) { + out := new(GetTeamListResponse) + err := c.cc.Invoke(ctx, "/gitpod.experimental.v1.TeamsService/GetTeamList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *teamsServiceClient) DeleteTeam(ctx context.Context, in *DeleteTeamRequest, opts ...grpc.CallOption) (*DeleteTeamResponse, error) { out := new(DeleteTeamResponse) err := c.cc.Invoke(ctx, "/gitpod.experimental.v1.TeamsService/DeleteTeam", in, out, opts...) @@ -156,6 +167,8 @@ type TeamsServiceServer interface { GetTeam(context.Context, *GetTeamRequest) (*GetTeamResponse, error) // ListTeams lists the caller has access to. ListTeams(context.Context, *ListTeamsRequest) (*ListTeamsResponse, error) + // GetTeamList lists teams that the caller has access to. + GetTeamList(context.Context, *GetTeamListRequest) (*GetTeamListResponse, error) // DeleteTeam deletes the specified team. DeleteTeam(context.Context, *DeleteTeamRequest) (*DeleteTeamResponse, error) // GetTeamInvitation retrieves the invitation for a Team. @@ -186,6 +199,9 @@ func (UnimplementedTeamsServiceServer) GetTeam(context.Context, *GetTeamRequest) func (UnimplementedTeamsServiceServer) ListTeams(context.Context, *ListTeamsRequest) (*ListTeamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListTeams not implemented") } +func (UnimplementedTeamsServiceServer) GetTeamList(context.Context, *GetTeamListRequest) (*GetTeamListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTeamList not implemented") +} func (UnimplementedTeamsServiceServer) DeleteTeam(context.Context, *DeleteTeamRequest) (*DeleteTeamResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteTeam not implemented") } @@ -274,6 +290,24 @@ func _TeamsService_ListTeams_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _TeamsService_GetTeamList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTeamListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamsServiceServer).GetTeamList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gitpod.experimental.v1.TeamsService/GetTeamList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamsServiceServer).GetTeamList(ctx, req.(*GetTeamListRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TeamsService_DeleteTeam_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteTeamRequest) if err := dec(in); err != nil { @@ -419,6 +453,10 @@ var TeamsService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListTeams", Handler: _TeamsService_ListTeams_Handler, }, + { + MethodName: "GetTeamList", + Handler: _TeamsService_GetTeamList_Handler, + }, { MethodName: "DeleteTeam", Handler: _TeamsService_DeleteTeam_Handler, diff --git a/components/public-api/go/experimental/v1/v1connect/teams.connect.go b/components/public-api/go/experimental/v1/v1connect/teams.connect.go index ecd092946b45e3..81f36431cf8182 100644 --- a/components/public-api/go/experimental/v1/v1connect/teams.connect.go +++ b/components/public-api/go/experimental/v1/v1connect/teams.connect.go @@ -37,6 +37,8 @@ type TeamsServiceClient interface { GetTeam(context.Context, *connect_go.Request[v1.GetTeamRequest]) (*connect_go.Response[v1.GetTeamResponse], error) // ListTeams lists the caller has access to. ListTeams(context.Context, *connect_go.Request[v1.ListTeamsRequest]) (*connect_go.Response[v1.ListTeamsResponse], error) + // GetTeamList lists teams that the caller has access to. + GetTeamList(context.Context, *connect_go.Request[v1.GetTeamListRequest]) (*connect_go.Response[v1.GetTeamListResponse], error) // DeleteTeam deletes the specified team. DeleteTeam(context.Context, *connect_go.Request[v1.DeleteTeamRequest]) (*connect_go.Response[v1.DeleteTeamResponse], error) // GetTeamInvitation retrieves the invitation for a Team. @@ -78,6 +80,11 @@ func NewTeamsServiceClient(httpClient connect_go.HTTPClient, baseURL string, opt baseURL+"/gitpod.experimental.v1.TeamsService/ListTeams", opts..., ), + getTeamList: connect_go.NewClient[v1.GetTeamListRequest, v1.GetTeamListResponse]( + httpClient, + baseURL+"/gitpod.experimental.v1.TeamsService/GetTeamList", + opts..., + ), deleteTeam: connect_go.NewClient[v1.DeleteTeamRequest, v1.DeleteTeamResponse]( httpClient, baseURL+"/gitpod.experimental.v1.TeamsService/DeleteTeam", @@ -121,6 +128,7 @@ type teamsServiceClient struct { createTeam *connect_go.Client[v1.CreateTeamRequest, v1.CreateTeamResponse] getTeam *connect_go.Client[v1.GetTeamRequest, v1.GetTeamResponse] listTeams *connect_go.Client[v1.ListTeamsRequest, v1.ListTeamsResponse] + getTeamList *connect_go.Client[v1.GetTeamListRequest, v1.GetTeamListResponse] deleteTeam *connect_go.Client[v1.DeleteTeamRequest, v1.DeleteTeamResponse] getTeamInvitation *connect_go.Client[v1.GetTeamInvitationRequest, v1.GetTeamInvitationResponse] joinTeam *connect_go.Client[v1.JoinTeamRequest, v1.JoinTeamResponse] @@ -145,6 +153,11 @@ func (c *teamsServiceClient) ListTeams(ctx context.Context, req *connect_go.Requ return c.listTeams.CallUnary(ctx, req) } +// GetTeamList calls gitpod.experimental.v1.TeamsService.GetTeamList. +func (c *teamsServiceClient) GetTeamList(ctx context.Context, req *connect_go.Request[v1.GetTeamListRequest]) (*connect_go.Response[v1.GetTeamListResponse], error) { + return c.getTeamList.CallUnary(ctx, req) +} + // DeleteTeam calls gitpod.experimental.v1.TeamsService.DeleteTeam. func (c *teamsServiceClient) DeleteTeam(ctx context.Context, req *connect_go.Request[v1.DeleteTeamRequest]) (*connect_go.Response[v1.DeleteTeamResponse], error) { return c.deleteTeam.CallUnary(ctx, req) @@ -188,6 +201,8 @@ type TeamsServiceHandler interface { GetTeam(context.Context, *connect_go.Request[v1.GetTeamRequest]) (*connect_go.Response[v1.GetTeamResponse], error) // ListTeams lists the caller has access to. ListTeams(context.Context, *connect_go.Request[v1.ListTeamsRequest]) (*connect_go.Response[v1.ListTeamsResponse], error) + // GetTeamList lists teams that the caller has access to. + GetTeamList(context.Context, *connect_go.Request[v1.GetTeamListRequest]) (*connect_go.Response[v1.GetTeamListResponse], error) // DeleteTeam deletes the specified team. DeleteTeam(context.Context, *connect_go.Request[v1.DeleteTeamRequest]) (*connect_go.Response[v1.DeleteTeamResponse], error) // GetTeamInvitation retrieves the invitation for a Team. @@ -226,6 +241,11 @@ func NewTeamsServiceHandler(svc TeamsServiceHandler, opts ...connect_go.HandlerO svc.ListTeams, opts..., )) + mux.Handle("/gitpod.experimental.v1.TeamsService/GetTeamList", connect_go.NewUnaryHandler( + "/gitpod.experimental.v1.TeamsService/GetTeamList", + svc.GetTeamList, + opts..., + )) mux.Handle("/gitpod.experimental.v1.TeamsService/DeleteTeam", connect_go.NewUnaryHandler( "/gitpod.experimental.v1.TeamsService/DeleteTeam", svc.DeleteTeam, @@ -279,6 +299,10 @@ func (UnimplementedTeamsServiceHandler) ListTeams(context.Context, *connect_go.R return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.experimental.v1.TeamsService.ListTeams is not implemented")) } +func (UnimplementedTeamsServiceHandler) GetTeamList(context.Context, *connect_go.Request[v1.GetTeamListRequest]) (*connect_go.Response[v1.GetTeamListResponse], error) { + return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.experimental.v1.TeamsService.GetTeamList is not implemented")) +} + func (UnimplementedTeamsServiceHandler) DeleteTeam(context.Context, *connect_go.Request[v1.DeleteTeamRequest]) (*connect_go.Response[v1.DeleteTeamResponse], error) { return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.experimental.v1.TeamsService.DeleteTeam is not implemented")) } diff --git a/components/public-api/go/experimental/v1/v1connect/teams.proxy.connect.go b/components/public-api/go/experimental/v1/v1connect/teams.proxy.connect.go index ff15a8f4a31902..7c991e45001f40 100644 --- a/components/public-api/go/experimental/v1/v1connect/teams.proxy.connect.go +++ b/components/public-api/go/experimental/v1/v1connect/teams.proxy.connect.go @@ -49,6 +49,16 @@ func (s *ProxyTeamsServiceHandler) ListTeams(ctx context.Context, req *connect_g return connect_go.NewResponse(resp), nil } +func (s *ProxyTeamsServiceHandler) GetTeamList(ctx context.Context, req *connect_go.Request[v1.GetTeamListRequest]) (*connect_go.Response[v1.GetTeamListResponse], error) { + resp, err := s.Client.GetTeamList(ctx, req.Msg) + if err != nil { + // TODO(milan): Convert to correct status code + return nil, err + } + + return connect_go.NewResponse(resp), nil +} + func (s *ProxyTeamsServiceHandler) DeleteTeam(ctx context.Context, req *connect_go.Request[v1.DeleteTeamRequest]) (*connect_go.Response[v1.DeleteTeamResponse], error) { resp, err := s.Client.DeleteTeam(ctx, req.Msg) if err != nil { diff --git a/components/public-api/typescript/src/gitpod/experimental/v1/teams_connect.ts b/components/public-api/typescript/src/gitpod/experimental/v1/teams_connect.ts index 7d7b2b27ae35ef..cfaa0e326c9204 100644 --- a/components/public-api/typescript/src/gitpod/experimental/v1/teams_connect.ts +++ b/components/public-api/typescript/src/gitpod/experimental/v1/teams_connect.ts @@ -9,7 +9,7 @@ /* eslint-disable */ // @ts-nocheck -import { CreateTeamRequest, CreateTeamResponse, DeleteTeamMemberRequest, DeleteTeamMemberResponse, DeleteTeamRequest, DeleteTeamResponse, GetTeamInvitationRequest, GetTeamInvitationResponse, GetTeamRequest, GetTeamResponse, JoinTeamRequest, JoinTeamResponse, ListTeamMembersRequest, ListTeamMembersResponse, ListTeamsRequest, ListTeamsResponse, ResetTeamInvitationRequest, ResetTeamInvitationResponse, UpdateTeamMemberRequest, UpdateTeamMemberResponse } from "./teams_pb.js"; +import { CreateTeamRequest, CreateTeamResponse, DeleteTeamMemberRequest, DeleteTeamMemberResponse, DeleteTeamRequest, DeleteTeamResponse, GetTeamInvitationRequest, GetTeamInvitationResponse, GetTeamListRequest, GetTeamListResponse, GetTeamRequest, GetTeamResponse, JoinTeamRequest, JoinTeamResponse, ListTeamMembersRequest, ListTeamMembersResponse, ListTeamsRequest, ListTeamsResponse, ResetTeamInvitationRequest, ResetTeamInvitationResponse, UpdateTeamMemberRequest, UpdateTeamMemberResponse } from "./teams_pb.js"; import { MethodKind } from "@bufbuild/protobuf"; /** @@ -51,6 +51,17 @@ export const TeamsService = { O: ListTeamsResponse, kind: MethodKind.Unary, }, + /** + * GetTeamList lists teams that the caller has access to. + * + * @generated from rpc gitpod.experimental.v1.TeamsService.GetTeamList + */ + getTeamList: { + name: "GetTeamList", + I: GetTeamListRequest, + O: GetTeamListResponse, + kind: MethodKind.Unary, + }, /** * DeleteTeam deletes the specified team. * diff --git a/components/public-api/typescript/src/gitpod/experimental/v1/teams_pb.ts b/components/public-api/typescript/src/gitpod/experimental/v1/teams_pb.ts index 7badc017d71541..ba48db181d5a15 100644 --- a/components/public-api/typescript/src/gitpod/experimental/v1/teams_pb.ts +++ b/components/public-api/typescript/src/gitpod/experimental/v1/teams_pb.ts @@ -116,6 +116,61 @@ export class Team extends Message { } } +/** + * @generated from message gitpod.experimental.v1.TeamMeta + */ +export class TeamMeta extends Message { + /** + * id is a UUID of the Team + * + * @generated from field: string id = 1; + */ + id = ""; + + /** + * name is the name of the Team + * + * @generated from field: string name = 2; + */ + name = ""; + + /** + * slug is the slug of the Team + * + * @generated from field: string slug = 3; + */ + slug = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.experimental.v1.TeamMeta"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "slug", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TeamMeta { + return new TeamMeta().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TeamMeta { + return new TeamMeta().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TeamMeta { + return new TeamMeta().fromJsonString(jsonString, options); + } + + static equals(a: TeamMeta | PlainMessage | undefined, b: TeamMeta | PlainMessage | undefined): boolean { + return proto3.util.equals(TeamMeta, a, b); + } +} + /** * @generated from message gitpod.experimental.v1.TeamMember */ @@ -464,6 +519,74 @@ export class ListTeamsResponse extends Message { } } +/** + * @generated from message gitpod.experimental.v1.GetTeamListRequest + */ +export class GetTeamListRequest extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.experimental.v1.GetTeamListRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetTeamListRequest { + return new GetTeamListRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetTeamListRequest { + return new GetTeamListRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetTeamListRequest { + return new GetTeamListRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetTeamListRequest | PlainMessage | undefined, b: GetTeamListRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetTeamListRequest, a, b); + } +} + +/** + * @generated from message gitpod.experimental.v1.GetTeamListResponse + */ +export class GetTeamListResponse extends Message { + /** + * @generated from field: repeated gitpod.experimental.v1.TeamMeta teams = 1; + */ + teams: TeamMeta[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.experimental.v1.GetTeamListResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "teams", kind: "message", T: TeamMeta, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetTeamListResponse { + return new GetTeamListResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetTeamListResponse { + return new GetTeamListResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetTeamListResponse { + return new GetTeamListResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetTeamListResponse | PlainMessage | undefined, b: GetTeamListResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetTeamListResponse, a, b); + } +} + /** * @generated from message gitpod.experimental.v1.DeleteTeamRequest */ diff --git a/components/server/src/api/teams.ts b/components/server/src/api/teams.ts index c45e5366006664..65bd816b3e7322 100644 --- a/components/server/src/api/teams.ts +++ b/components/server/src/api/teams.ts @@ -16,6 +16,8 @@ import { DeleteTeamResponse, GetTeamInvitationRequest, GetTeamInvitationResponse, + GetTeamListRequest, + GetTeamListResponse, GetTeamRequest, GetTeamResponse, JoinTeamRequest, @@ -91,6 +93,9 @@ export class APITeamsService implements ServiceImpl public async listTeamMembers(req: ListTeamMembersRequest): Promise { throw new ConnectError("unimplemented", Code.Unimplemented); } + public async getTeamList(req: GetTeamListRequest): Promise { + throw new ConnectError("unimplemented", Code.Unimplemented); + } } export function toAPITeam(team: Organization, members: OrgMemberInfo[], invite: TeamMembershipInvite): Team {