Les meilleurs développeurs PHP freelances sont sur Codeur.com

Développement d'un connecteur SFTP en NodeJS

 Fermé·Moins de 500 €·9 offres·599 vues·5 interactions


But :
Le programme doit surveiller un SFTP et lorsqu'un nouveau fichier CSV y est uploadé, le programme doit utiliser son contenu afin de générer un certain nombre d'appels d'API.

Prérequis :
Connaissance de développement avec NodeJS.
Compatibilité avec NodeJS 12 - 16, sauf contrainte technique justifiée.
Avoir un serveur SFTP accessible pour vos tests.

Livrable :
Code source complet du projet NodeJS.
Code source intégralement écrit en anglais.
Code source avec des commentaires adaptés.
Utilisation d'une librairie NodeJS pour interagir avec le SFTP. Suggestion : [URL visible pour les membres Pro], un wrapper au-dessus de [URL visible pour les membres Pro]
Utilisation d'un dialecte JavaScript moderne : const/let à la place de var, promesses au lieu de callbacks, arrow functions aux endroits adaptés, syntaxe d'imports import X from 'dependency', points-virgules à la fin des lignes. TypeScript accepté mais pas requis.

Algorithme
=============================
Constantes à initialiser depuis les variables d'environnement du même nom, avec les valeurs par défaut éventuelles suivantes :
FTP_HOST : le nom d'hôte FTP auquel se connecter
FTP_PORT = 22 : port du serveur SFTP.
FTP_USER = "" (anonyme) : le nom d'utilisateur FTP à utiliser
FTP_PRIVATE_KEY : le chemin du fichier contenant la clé privée SSH à utiliser
LISTING_INTERVAL_MS = 60000 : la durée en millisecondes entre deux listage des fichiers du FTP.
STALE_FILE_CHECKS = 1 : le nombre de cycles de vérification nécessaire pour détecter qu'un fichier ne change plus.
CSV_COLUMN_USER_ID = user_id : nom d'en-tête de la colonne contenant un userId.
CSV_COLUMN_CAMPAIGN_ID = campaign_id : nom d'en-tête de la colonne contenant un campaignId.
WP_ENDPOINT = [URL visible pour les membres Pro] : URL de l'API à appeler.
WP_ACCESS_TOKEN : access token de l'API à appeler.
WP_MAXIMUM_DELIVERIES_TARGETS = 10000 : nombre maximum de lignes à regrouper au sein d'un seul appel HTTPS.

Algorithme de sélection des fichiers :
=============================
Se connecter au serveur SFTP en utilisant les valeurs de FTP_HOST, FTP_PORT, FTP_USER et FTP_PRIVATE_KEY.
Créer une liste de fichiers candidats candidateFiles, initialement vide.
Lister tous les fichiers initialement existants avec leur taille et date de modification, stocker cette liste dans lastListing en utilisant le nom du fichier comme clé.
Tous les LISTING_INTERVAL_MS, lister les fichiers dans newListing.
Comparer lastListing et newListing, incrémenter le nombre de cycles des fichiers qui n'ont pas changé. Une fois que ce nombre atteint STALE_FILE_CHECKS pour un fichier, il faut lancer le traitement dessus.
Identifier les nouveaux fichiers, les mettre dans la liste candidateFiles à surveiller afin d'attendre qu'ils ne soient plus modifiés. Logguer le nom du fichier.

Algorithme de traitement d'un fichier :
=============================
Logguer le début de traitement du fichier.
Télécharger le fichier en entier dans un fichier temporaire.
Lire le fichier comme un CSV dont la première ligne comporte le nom des colonnes. Toutes les valeurs devront être lues comme étant des chaînes de caractères.
Les colonnes dont le nom d'en-tête sont CSV_COLUMN_USER_ID et CSV_COLUMN_CAMPAIGN_ID sont à isoler des autres colonnes éventuelles. Ces autres colonnes forment un dictionnaire clé-valeur de champs de personnalisation.
Regrouper les lignes par paquet de MAXIMUM_DELIVERIES_TARGETS.
Toutes les valeurs de la colonne CSV_COLUMN_USER_ID sont à mettre dans un tableau stocké dans une variable targetUserIds.
La valeur de la colonne CSV_COLUMN_CAMPAIGN_ID, censée être identique sur toutes les lignes, sera stockée dans la variable campaignId.
Les colonnes de personnalisation seront stockées comme un dictionnaire (un simple objet JavaScript) dans un tableau stocké dans une variable notificationParams. Cette variable contient donc un tableau d'objets.
Il est crucial que les valeurs de targetUserIds et notificationParams à un index donné se correspondent.
Générer 1 appel HTTPS suivant par paquet de lignes :

POST [URL visible pour les membres Pro]
Content-Type: application/json

{"accessToken":<WP_ACCESS_TOKEN>,"targetUserIds":<targetUserIds>,"campaignId":<campaignId>,"notificationParams":<notificationParams>}

S'il n'y a aucune colonne de personnalisation, il ne faut pas donner le paramètre notificationParams à l'appel d'API. Ceci devra être déterminé lors de la lecture de la première ligne d'en-tête du CSV.
À chaque appel, logguer le résultat de l'appel à la sortie avec son code de retour ainsi que les numéros de lignes traitées correspondantes. Un code de retour entre 200 et 299 est considéré comme un succès.
Logguer la fin du traitement du fichier.
Exemple de fichier téléchargé et d'appel HTTPS correspondant
Fichier CSV :
user_id,campaign_id,nom,prenom,someData,somethingElse
[Téléphone visible pour les membres Pro],01fhnq04qm7lpsg2,Bonnie,Parker,foo,bar
[Téléphone visible pour les membres Pro],01fhnq04qm7lpsg2,Clyde,Barrow,qux,bla

Appel HTTPS :
POST [URL visible pour les membres Pro]
Content-Type: application/json

{
"accessToken": <WP_ACCESS_TOKEN>,
"targetUserIds": ["[Téléphone visible pour les membres Pro]","[Téléphone visible pour les membres Pro]"],
"campaignId": "01fhnq04qm7lpsg2",
"notificationParams": [
{"someData":"foo","somethingElse","bar"},
{"someData":"qux","somethingElse":"bla"}
]
}

Retour attendu :
HTTP 202 Accepted
Content-Type: application/json

{"success":true,"campaignId":"01fhnq04qm7lpsg2","notificationId":"01fhnq04qm7fwh3s"}

Budget indicatif : Moins de 500 €

Publication : 23 novembre 2021 à 11h29

Profils recherchés : Développeur PHP freelance

Le profil du client est reservé aux prestataires abonnés

Créer un compte

9 freelances ont répondu à ce projet

7 propositions de devis en moins de 2h

+2

Montant moyen des devis proposés : 850 €

Estimation du délai : 2 jours

Publier un projet similaire

Chaque jour, des centaines de clients utilisent Codeur.com pour trouver un prestataire. Créez votre compte dès maintenant, remplissez votre profil et trouvez de nouveaux clients.

Trouver des nouveaux clients

Votre navigateur Web n’est plus à jour. Il ne permet pas d’afficher correctement le site Codeur.com.
Nous vous invitons à mettre à jour votre navigateur ou à utiliser un autre navigateur plus récent.