blob: 3f35127b3b57ac43e5de02593a8538c64ef6a31b [file] [log] [blame]
/**
* @license
* Copyright 2022 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {AccountDetailInfo, AccountInfo} from '../../api/rest-api';
import {RestApiService} from '../../services/gr-rest-api/gr-rest-api';
import {Finalizable} from '../../services/registry';
import {UserId} from '../../types/common';
import {getUserId, isDetailedAccount} from '../../utils/account-util';
import {define} from '../dependency';
import {Model} from '../model';
export interface AccountsState {
accounts: {[id: UserId]: AccountDetailInfo};
}
export const accountsModelToken = define<AccountsModel>('accounts-model');
export class AccountsModel extends Model<AccountsState> implements Finalizable {
constructor(readonly restApiService: RestApiService) {
super({
accounts: {},
});
}
private updateStateAccount(id: UserId, account?: AccountDetailInfo) {
if (!account) return;
const current = {...this.getState()};
current.accounts = {...current.accounts, [id]: account};
this.setState(current);
}
async getAccount(partialAccount: AccountInfo) {
const current = this.getState();
const id = getUserId(partialAccount);
if (current.accounts[id]) return current.accounts[id];
// It is possible to add emails to CC when they don't have a Gerrit
// account. In this case getAccountDetails will return a 404 error hence
// pass an empty error function to handle that.
const account = await this.restApiService.getAccountDetails(id, () => {
this.updateStateAccount(id, partialAccount as AccountDetailInfo);
return;
});
if (account) this.updateStateAccount(id, account);
return account;
}
async fillDetails(account: AccountInfo) {
if (!isDetailedAccount(account)) {
if (account.email) return await this.getAccount({email: account.email});
else if (account._account_id)
return await this.getAccount({_account_id: account._account_id});
}
return account;
}
}