/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as azdata from 'azdata'; import { Event, Emitter } from 'vs/base/common/event'; import { IAccountManagementService } from 'sql/platform/accounts/common/interfaces'; import { AccountProviderAddedEventParams, UpdateAccountListEventParams } from 'sql/platform/accounts/common/eventTypes'; import { coalesce } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; /** * View model for account dialog */ export class AccountViewModel { // EVENTING /////////////////////////////////////////////////////// private _addProviderEmitter: Emitter; public get addProviderEvent(): Event { return this._addProviderEmitter.event; } private _removeProviderEmitter: Emitter; public get removeProviderEvent(): Event { return this._removeProviderEmitter.event; } private _updateAccountListEmitter: Emitter; public get updateAccountListEvent(): Event { return this._updateAccountListEmitter.event; } constructor(@IAccountManagementService private _accountManagementService: IAccountManagementService, @ILogService private _logService: ILogService) { // Create our event emitters this._addProviderEmitter = new Emitter(); this._removeProviderEmitter = new Emitter(); this._updateAccountListEmitter = new Emitter(); // Register handlers for any changes to the providers or accounts this._accountManagementService.addAccountProviderEvent(arg => this._addProviderEmitter.fire(arg)); this._accountManagementService.removeAccountProviderEvent(arg => this._removeProviderEmitter.fire(arg)); this._accountManagementService.updateAccountListEvent(arg => this._updateAccountListEmitter.fire(arg)); } // PUBLIC METHODS ////////////////////////////////////////////////////// /** * Loads an initial list of account providers and accounts from the account management service * and fires an event after each provider/accounts has been loaded. * */ public async initialize(): Promise { // Load a baseline of the account provider metadata and accounts // 1) Get all the providers from the account management service // 2) For each provider, get the accounts // 3) Build parameters to add a provider and return it try { const metadata = await this._accountManagementService.getAccountProviderMetadata(); const accounts = await Promise.all(metadata.map(async providerMetadata => { try { const accounts = await this._accountManagementService.getAccountsForProvider(providerMetadata.id); return { addedProvider: providerMetadata, initialAccounts: accounts }; } catch (err) { this._logService.warn(`Error getting accounts for provider ${providerMetadata.id} : ${err}`); return undefined; } })); return coalesce(accounts); } catch (err) { this._logService.warn(`Error getting account provider metadata : ${err}`); return []; } } }