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
FA
- 174