mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 20:30:33 +00:00
add server to monorepo.
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
import { get } from 'lodash';
|
||||
import { Service } from 'typedi';
|
||||
import { FeaturesConfigure } from './constants';
|
||||
|
||||
@Service()
|
||||
export class FeaturesConfigureManager {
|
||||
/**
|
||||
*
|
||||
* @param featureName
|
||||
* @returns
|
||||
*/
|
||||
getFeatureConfigure = (featureName: string, accessor?: string) => {
|
||||
const meta = FeaturesConfigure.find(
|
||||
(feature) => feature.name === featureName
|
||||
);
|
||||
return accessor ? get(meta, accessor) : meta;
|
||||
};
|
||||
}
|
||||
74
packages/server/src/services/Features/FeaturesManager.ts
Normal file
74
packages/server/src/services/Features/FeaturesManager.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import { defaultTo } from 'lodash';
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { omit } from 'lodash';
|
||||
import { FeaturesSettingsDriver } from './FeaturesSettingsDriver';
|
||||
import { FeaturesConfigureManager } from './FeaturesConfigureManager';
|
||||
import { IFeatureAllItem } from '@/interfaces';
|
||||
|
||||
@Service()
|
||||
export class FeaturesManager {
|
||||
@Inject()
|
||||
private drive: FeaturesSettingsDriver;
|
||||
|
||||
@Inject()
|
||||
private configure: FeaturesConfigureManager;
|
||||
|
||||
/**
|
||||
* Turns-on the given feature name.
|
||||
* @param {number} tenantId
|
||||
* @param {string} feature
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public turnOn(tenantId: number, feature: string) {
|
||||
return this.drive.turnOn(tenantId, feature);
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns-off the given feature name.
|
||||
* @param {number} tenantId
|
||||
* @param {string} feature
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public turnOff(tenantId: number, feature: string) {
|
||||
return this.drive.turnOff(tenantId, feature);
|
||||
}
|
||||
|
||||
/**
|
||||
* Detarmines the given feature name is accessiable.
|
||||
* @param {number} tenantId
|
||||
* @param {string} feature
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public async accessible(tenantId: number, feature: string) {
|
||||
// Retrieves the feature default accessible value.
|
||||
const defaultValue = this.configure.getFeatureConfigure(
|
||||
feature,
|
||||
'defaultValue'
|
||||
);
|
||||
const isAccessible = await this.drive.accessible(tenantId, feature);
|
||||
|
||||
return defaultTo(isAccessible, defaultValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the all features and their accessible value and default value.
|
||||
* @param {number} tenantId
|
||||
* @returns
|
||||
*/
|
||||
public async all(tenantId: number): Promise<IFeatureAllItem[]> {
|
||||
const all = await this.drive.all(tenantId);
|
||||
|
||||
return all.map((feature: IFeatureAllItem) => {
|
||||
const defaultAccessible = this.configure.getFeatureConfigure(
|
||||
feature.name,
|
||||
'defaultValue'
|
||||
);
|
||||
const isAccessible = feature.isAccessible;
|
||||
|
||||
return {
|
||||
...feature,
|
||||
isAccessible: defaultTo(isAccessible, defaultAccessible),
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
import { Service, Inject } from 'typedi';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { FeaturesConfigure } from './constants';
|
||||
import { IFeatureAllItem } from '@/interfaces';
|
||||
|
||||
@Service()
|
||||
export class FeaturesSettingsDriver {
|
||||
@Inject()
|
||||
tenancy: HasTenancyService;
|
||||
|
||||
/**
|
||||
* Turns-on the given feature name.
|
||||
* @param {number} tenantId
|
||||
* @param {string} feature
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async turnOn(tenantId: number, feature: string) {
|
||||
const settings = this.tenancy.settings(tenantId);
|
||||
|
||||
settings.set({ group: 'features', key: feature, value: true });
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns-off the given feature name.
|
||||
* @param {number} tenantId
|
||||
* @param {string} feature
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async turnOff(tenantId: number, feature: string) {
|
||||
const settings = this.tenancy.settings(tenantId);
|
||||
|
||||
settings.set({ group: 'features', key: feature, value: false });
|
||||
}
|
||||
|
||||
/**
|
||||
* Detarmines the given feature name is accessiable.
|
||||
* @param {number} tenantId
|
||||
* @param {string} feature
|
||||
* @returns {Promise<boolean|null|undefined>}
|
||||
*/
|
||||
async accessible(tenantId: number, feature: string) {
|
||||
const settings = this.tenancy.settings(tenantId);
|
||||
|
||||
return !!settings.get({ group: 'features', key: feature });
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the all features and their accessible value and default value.
|
||||
* @param {number} tenantId
|
||||
* @returns {Promise<IFeatureAllItem>}
|
||||
*/
|
||||
async all(tenantId: number): Promise<IFeatureAllItem[]> {
|
||||
const mappedOpers = FeaturesConfigure.map(async (featureConfigure) => {
|
||||
const { name, defaultValue } = featureConfigure;
|
||||
const isAccessible = await this.accessible(
|
||||
tenantId,
|
||||
featureConfigure.name
|
||||
);
|
||||
return { name, isAccessible, defaultAccessible: defaultValue };
|
||||
});
|
||||
return Promise.all(mappedOpers);
|
||||
}
|
||||
}
|
||||
12
packages/server/src/services/Features/constants.ts
Normal file
12
packages/server/src/services/Features/constants.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { Features, IFeatureConfiugration } from '@/interfaces';
|
||||
|
||||
export const FeaturesConfigure: IFeatureConfiugration[] = [
|
||||
{
|
||||
name: Features.BRANCHES,
|
||||
defaultValue: false,
|
||||
},
|
||||
{
|
||||
name: Features.WAREHOUSES,
|
||||
defaultValue: false,
|
||||
},
|
||||
];
|
||||
Reference in New Issue
Block a user