add server to monorepo.

This commit is contained in:
a.bouhuolia
2023-02-03 11:57:50 +02:00
parent 28e309981b
commit 80b97b5fdc
1303 changed files with 137049 additions and 0 deletions

View File

@@ -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;
};
}

View 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),
};
});
}
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,12 @@
import { Features, IFeatureConfiugration } from '@/interfaces';
export const FeaturesConfigure: IFeatureConfiugration[] = [
{
name: Features.BRANCHES,
defaultValue: false,
},
{
name: Features.WAREHOUSES,
defaultValue: false,
},
];