125 lines
3.2 KiB
JavaScript
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;
|
|
}
|
|
}
|