Skip to content

Instantly share code, notes, and snippets.

@vectorderivative
Last active May 15, 2019 22:57
Show Gist options
  • Save vectorderivative/68fa3936d4ab1bc1fb40e26f8b7d026c to your computer and use it in GitHub Desktop.
Save vectorderivative/68fa3936d4ab1bc1fb40e26f8b7d026c to your computer and use it in GitHub Desktop.
Welcome file

Configuración


{

provide: 'AppConfigurationOptions',

useValue: {

applicationCode: 'INVOICE_PAYMENTS',

hostname: '',

environment: _environment(),

releaseVersion: '2.2.4.0',

useLocalManifest: true,

productPath: '/',

localManifestUrl: urlConfigurationManifest

} as IAppConfigurationOptions

},

Además de importar el módulo se require un objeto de configuration: la interfaz IAppConfigurationOptions


export  interface  IAppConfigurationOptions {

applicationCode: string;

releaseVersion: string;

environment: Environment;

hostname: string;

productPath: string;

useLocalManifest?: boolean;

localManifestUrl?: string;

loadConfigurations?: () => IConfiguration[];

}

Se coloca como provider en el módulo padre de la aplicación.


Servicio ipc-app-configuration.service

isEnabled(configuration: string)

Se le manda el nombre de la configuración.

El nombre está compuesto así: ConfigurationName@ConfigurationVersion#ProductVersion

Sólo es obligatorio especificar el nombre


constructor(configurationService: AppConfigurationService) {

if (configurationService.isEnabled('configurationName')) {

doSomething();

}

}

getConfiguration(configuration: string)

Para obtener todo el objeto de la configuración, por lo general sólo se usaría para obtener la propiedad options


configurationService.getConfiguration('configurationName').options;

configurationLoaded: ReplaySubject

Observable que resuelve true cuando las configuraciones están cargadas en memoria


configurationService.configurationsLoaded.subscribe(isLoaded$  => {

if (isLoaded) {

// There are configurations in memory, do something

}

})

Hay un Guard que evita que se acceda a la aplicación si no están cargadas las configura por lo que este observable probablemente no será utilizado

Directiva ipc-app-configuration.directive

*ipcAppConfiguration="'configurationName'"

La directiva toma una configuración, verifica si esta activa y renderea su contendio.

No altera el DOM.

Ojo la string del nombre debe estar entrecomillada aunque ya estén las comillas del atributo.


<ng-container  *ipcAppConfiguration="['dashboard.pending-orders', 'dashboard.credit-limit']">

<pending-orders-card></pending-orders-card>

</ng-container>

Se le puede pasar un arreglo si se desea que una configuración se renderee al cumplirse todos los elementos de dicho arreglo.


<ng-container  *ipcAppConfiguration="['dashboard.pending-orders', 'dashboard.credit-limit']; matchAny: true">

<pending-orders-card></pending-orders-card>

</ng-container>

Se le pasa true al input matchAny para que trate la lista de configuraciones como un OR, es decir, se renderea la configuración si se cumple mínimo uno.

Guard ipc-app-configuration.guard

El guardían por ahora sólo tiene un CanActivateChild que sólo permite el paso cuando las configuraciones están cargadas, de no poder cargarse se redirige a una página de error.

La consola lanza errores y warnings respecto a los problemas que puedan surgir.

Estructura de configuraciones

Puedes revisar la interfaz Feature exportada en ipc-app-configuration.service.ts

configuration: string

El nombre de la configuración, se le puede especificar una versión y una versión de producto a la que aplicará como se comenta más arriba.

country: string | Array

Lista de países a los que aplicará. Se coteja contra el país del usuario. Es el código ISO en mayúsculas

role, role_any, role_match: string | Array

Roles que aplicará.

Role: Un único role

Role_any: Lista de roles, la configuración se activará si uno de los roles es encontrado en el usuario

Role_match: Lista de roles, la configuración se activará si todos los roles coinciden con el usuario

includes

Objeto con role, role_any, role_match y country.

La configuración estará activo si hay un match con las propiedades.

Esta propiedad es opcional, se puede utilizar includes o utilizar las propiedades en el nodo padre de la configuración. Ej:

Estas dos configuraciones se comportarán igual.


{

"feature": "using-includes",

"includes": {

"country": "DE"

}

"environment": "Development"

},

{

"feature": "not-using-includes",

"country": "DE",

"environment": "Development"

}

Si se especifican las propiedades en el objeto includes y afuera de este, sólo se tomará en cuenta el objeto includes. Ej: En este caso la configuración sólo aplica para DE


{

"feature": "using-includes",

"includes": {

"country": "DE"

},

"country": "MX",

"environment": "Development"

}

excludes

Objeto con role, role_any, role_match y country

La configuración se desactivará si hay un match con las propiedades


{

"feature": "using-excludes",

"excludes": {

"country": "DE",

"role": "paymentSomething"

},

"environment": "Development"

}

options: any

Hay casos donde se necesita obtener información extra relacionada a una configuración, por ejemplo necesitar información de configuración de las tablas, esta información se especifica en el objeto options


{

"feature": "test@1.0",

"country": "US",

"role_any": "ARMORGAPC, ARMORGARCAdv, ARMORGreconcile",

"environment": "Development",

"options": {

"anObject": {

"with": "options"

}

}

}

La forma de acceder a este objeto ya se habló mas arriba.


En el caso de especificar una configuración con distintas configuraciones por target se debe agregar primero la configuración ‘default’ o más general


{

"feature": "footer.privacy-link-route",

"options": {

"privacyRoute": "https://www.cemex.com/privacy-policy"

}

},

{

"feature": "footer.privacy-link-route",

"country": "DE",

"options": {

"privacyRoute": "https://www.cemex.de/Datenschutzrichtlinien.aspx"

}

}

Ej: Una URL en el footer que es para todos los países de una manera y con excepción para Alemania, se declara primero el default.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment