125 lines
3.2 KiB
JavaScript

import call from './call';
export default class Account {
constructor() {
this.user = null;
this.team = null;
this.ssh_key = null;
this.teams = [];
this.team_members = [];
this.onboarding = null;
this.balance = 0;
this.feature_flags = {};
this._fetchAccountPromise = null;
}
async fetchIfRequired() {
if (!this.user) {
if (this._fetchAccountPromise) {
await this._fetchAccountPromise;
} else {
await this.fetchAccount();
}
}
}
async fetchAccount() {
if (document.cookie.includes('user_id=Guest')) {
return;
}
try {
this._fetchAccountPromise = call('jcloud.api.account.get');
let result = await this._fetchAccountPromise;
this.user = result.user;
this.ssh_key = result.ssh_key;
this.team = result.team;
this.teams = result.teams;
this.team_members = result.team_members;
this.child_team_members = result.child_team_members;
this.onboarding = result.onboarding;
this.balance = result.balance;
this.feature_flags = result.feature_flags;
this.parent_team = result.parent_team;
this.partner_email = result.partner_email;
this.partner_billing_name = result.partner_billing_name;
this.saas_site_request = result.saas_site_request;
this.permissions = result.permissions;
this.number_of_sites = result.number_of_sites;
this.billing_info = result.billing_info;
} catch (e) {
localStorage.removeItem('current_team');
} finally {
this._fetchAccountPromise = null;
}
}
hasRole(role) {
let roles = this.user.roles.map(d => d.role);
return roles.includes(role);
}
async switchTeam(team) {
if (team === this.team.name) {
return;
}
let result = await call('jcloud.api.account.switch_team', { team });
this.team = result.team;
this.team_members = result.team_members;
localStorage.setItem('current_team', team);
}
async switchToTeam(team) {
await this.switchTeam(team);
window.location.reload();
}
get needsCard() {
return !this.hasBillingInfo;
}
get hasBillingInfo() {
if (!this.team) {
return true;
}
if (this.team.free_account || this.team.parent_team) {
return true;
}
if (this.team.payment_mode === 'Paid By Partner') {
// partner credits shall be deprecated in few months
return true;
}
if (['Card', 'Prepaid Credits'].includes(this.team.payment_mode)) {
// card is chargeable and not spam
return (
this.billing_info.verified_micro_charge ||
this.billing_info.has_paid_before ||
this.balance > 0
);
}
return false;
}
hasPermission(docname, action = '', list = false) {
// logged in user is site owner or
// has no granular permissions set, so has all permissions
if (
this.team.user === this.user.name ||
Object.keys(this.permissions).length === 0
) {
return true;
}
// if any permission is set for resource, show list view
if (Object.keys(this.permissions).includes(docname) && list) {
return true;
}
// check for granular restricted access
if (Object.keys(this.permissions).includes(docname)) {
if (this.permissions[docname].includes(action)) {
return true;
}
}
return false;
}
}