From a11f9ec7055ff7ff8f621157809a6b8dcc2cbc61 Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 11 Dec 2020 12:48:44 +0100 Subject: [PATCH] Add orgs command Change-type: minor Connects-to: #2119 Signed-off-by: Scott Lowe --- lib/commands/orgs.ts | 56 ++++++++++++++++++++++++++++++++++++++++++++ lib/utils/sdk.ts | 31 +++++++++++++++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 lib/commands/orgs.ts diff --git a/lib/commands/orgs.ts b/lib/commands/orgs.ts new file mode 100644 index 00000000..58918091 --- /dev/null +++ b/lib/commands/orgs.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright 2016-2020 Balena Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { flags } from '@oclif/command'; +import Command from '../command'; +import * as cf from '../utils/common-flags'; +import { getBalenaSdk, getVisuals, stripIndent } from '../utils/lazy'; + +interface FlagsDef { + help: void; +} + +export default class OrgsCmd extends Command { + public static description = stripIndent` + List all organizations. + + list all the organizations that you are a member of. +`; + public static examples = ['$ balena orgs']; + + public static usage = 'orgs'; + + public static flags: flags.Input = { + help: cf.help, + }; + + public static authenticated = true; + + public async run() { + this.parse(OrgsCmd); + + const { getOwnOrganizations } = await import('../utils/sdk'); + + // Get organizations + const organizations = await getOwnOrganizations(getBalenaSdk()); + + // Display + console.log( + getVisuals().table.horizontal(organizations, ['name', 'handle']), + ); + } +} diff --git a/lib/utils/sdk.ts b/lib/utils/sdk.ts index a957d7dd..70dd9f21 100644 --- a/lib/utils/sdk.ts +++ b/lib/utils/sdk.ts @@ -15,7 +15,12 @@ * limitations under the License. */ -import type { Application, BalenaSDK, PineOptions } from 'balena-sdk'; +import type { + Application, + BalenaSDK, + Organization, + PineOptions, +} from 'balena-sdk'; /** * Wraps the sdk application.get method, @@ -47,3 +52,27 @@ export async function getApplication( } return sdk.models.application.get(nameOrSlugOrId, options); } + +/** + * Wraps the sdk organization.getAll method, + * restricting to those orgs user is a member of + */ +export async function getOwnOrganizations( + sdk: BalenaSDK, +): Promise { + return await sdk.models.organization.getAll({ + $filter: { + organization_membership: { + $any: { + $alias: 'orm', + $expr: { + orm: { + user: await sdk.auth.getUserId(), + }, + }, + }, + }, + }, + $orderby: 'name asc', + }); +}