Ce que j'ai fait à Finance Active

mgargadennec

MarketApp

Contexte

Application déjà démarrée par Julien Revol & un prestataire externe

 

1) Nécessité de refaire l'administration
2) Finalisation du front-end de l'application

3) Exports Excel au lieu de CSV

4) Système de Dashboard dynamique

5) Paramétrage des définitions de widget

 

 

Refonte de l'administration

Contraintes : temps, pas de librairie Ngx compatible et/ou fonctionnelle

Solution : création d'une librairie interne à FA (angular-hal-client)

Résultat : développement facilité de toute la partie back-office de l'application, côté back-end & front-end

Idée : mettre en place une API REST HATEOAS (HAL) 

Finalisation du front-end

RAS

Exports Excel 

Contraintes : temps & coût des nombreux endpoints

Solution : utilisation d'Apache POI couplé à la négociation de contenu de Spring (HttpMessageResolver)

Résultat : l'ensemble des endpoints de data (courant, historique, forward)  peut exporter ses données en Excel à l'aide d'un code factorisé non-intrusif dans

Idée : remplacer les exports CSV généré côté front-end par des exports Excel

Dynamisation des Dashboards

Contraintes : besoin client

Solution : utilisation de la grille du fmk css et de la récursivité des row/columns

Résultat : de nouveaux tableaux de bord personnalisés pour chaque tenant peuvent être créés via une interface par assemblage de widgets 

Idée : rendre dynamique la disposition des widgets

Paramétrage des définitions de Widgets

Contraintes : besoin client & support

Solution : conversion CSV -> mongoDB

Résultat : les widgets sont paramétrables par le support (ajout/retrait de données) + de nouvelles version spécifiques à un tenant peuvent être ajoutés 

Idée : rendre paramétrable via l'application la définition de widget et la création de widgets spécifiques

Limite : manque de réflexion sur les interfaces --> complexité++ pour le support

Reste à faire

Simplifier l'utilisation du back-office par le support 

1) copies de définitions ?

2) création de workflows ?

3) export/import d'env. à env.

 

Scinder les sources de données des widgets de leur présentation

Refonte de l'API front des market data

PricerApp

Contexte

Application devant permettre aux utilisateurs finaux d'effectuer des pricing par eux-même

 

Application devant permettre aux utilisateurs finaux d'effectuer des pricing par eux-même

 


Un des objectifs était de rendre possible le décomissionnement de PricerWeb (?) en basculant l'ensemble des pricers sur cette application

Qu'est-ce qu'un pricer ?

Une simple fonction

f(x) => y

x & y & f sont variables
mais le fonctionnement global est identique 

Utilisation du polymorphisme

Back-end :
jackson
spring-plugin 

Front-end :
instantiation dynamique de composants

dynamic forms
 

Générateur de pricers

démonstration

RiskApp

Contexte

FA avait signé le premier client transatlantique (Hedgestar)

 

Les performances d'Apollo ne suffisaient pas pour afficher les

Mark-to-Market sans timeout ou looongue attente sur le portefeuille de 1400+ deals.

 

Fin novembre, lancement du projet RiskApp avec 1 mois de délai avant MEP.

Performance = parallélisation

Utilisation de RabbitMQ pour :

découpler / asynchroniser les appels aux pricers top10

paralléliser sur N instances & M threads par instances

 

Appels à Apollo

Apollo reste la source des données

mise en place d'API sécurisées avec un token machine-to-machine
 

 

 

Côté Risk App
 gestion d'un cycle de vie d'une intégration de portfolio
filtrage dynamique sur l'organization via appel (caché) à Apollo

Top10 Appcommons

Contexte

De nombreuses applications possèdent des fonctionnalités similaires, voire identiques :

gestion d'utilisateurs

gestion des permissions

token JWT & sécurité

cache

...


Devant l'urgence associée à chaque projet,
le code a souvent été copié/collé de projet en projet

Spring-Boot auto-configuration

Le fonctionnement de Spring-Boot permet de créer ses propres modules auto-configurés.


Il suffit pour cela d'un fichier

spring.factories dans resources/META-INF
qui pointe vers les configurations Java de Spring

 


Combiné avec les définitions conditionnelles de beans

@ConditionalOnProperty
@ConditionalOnBean

@ConditionalOnClass
...

Cache distribué

Fourni un module autoconfiguré qui :
 

tient compte de la présence de RabbitMQ dans le projet pour se déclencher

peut-être désactivé via les properties

envoi et reçoit des demandes d'invalidation partielle ou totale d'un cache, ou de refresh si c'est un LoadingCache

expose les métriques des caches via Actuator
 

audit

Configure et utilise Javers / Mongo pour gérer l'audit des divers objets métiers audités

Fourni une API REST unique pour extraire les logs des différents objets audités

Parse en rend plus lisible des "diffs" produits par Javers, pour un affichage front-end facilité + permet d'étendre le fonctionnement avec des implémentations spécifiques de l'interface ChangePrinter

 

user

Configure et utilise les repositories, services et controlleurs pour exposer et gérer les utilisateurs d'une application

 

Mets à jour les profils et droits des utilisateurs

 

Configure l'audit des utilisateurs

 

 


 

jwt-authentication

Sécurise tous les endpoints

Fourni un ServletFilter décodant le token JWT

 

Créé les nouveaux utilisateurs dans l'application à partir du profil USER correspondant

 

Gère les tenants visibles

 

Resolve un AuthenticationContext utilisable dans les handlers des controlleurs

 

 

environment-switch

Permet de basculer au runtime l'environnement cible de la

grille top10 & des proxies top10

Utilisable via Actuator ou ApplicationEvent

 

Utilisation intensives des

 BeanDefinitionRegistryPostProcessor
Proxies Java

ApplicationContext isolés

Cascade d'ApplicationEvent

Cockpit

Contexte

Temps un peu mort dans l'équipe après RiskApp + top10appcommons

 

Proposition de réaliser un POC pour refondre l'application Top10Track permettant la gestion des intégrations de données + la visualisation des données de la grille

 

L'intérêt étant avant tout de décommissionner Tapestry et d'améliorer l'utilisabilité de certaines fonctionnalités.

 

SearchApp

Contexte

Réalisation d'un recherche rapide de deals

 

Réalisation d'un POC

 

Mise en place des bases de l'application (librairie Typescript + settings + mappings ES)

 

 

Ecriture d'une surcouche à Elasticsearch permettant de constituer un SearchEngine complet (facettes, aggrégations, query, ...)

AnalysisApp

Contexte

Projet HPA - Lot 1

 

Utilisation d'Elasticsearch comme Datastore temporaire pour le lot 1

 

Aide à la mise en place du socle de l'application

+ ajout des statistiques

+ ajout de la gestion des erreurs

+ extension de la librarie de recherche pour gérer les statistiques nested 

+ écriture de l'API (export, search+analytics, cleanup)

FA

By Maël Gargadennec