Projet webservices pour l'Efrei
doc | ||
img | ||
migrations | ||
soap | ||
src | ||
.env | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
diesel.toml | ||
Makefile | ||
README.md |
Projet webservices
Composants
Un serveur fournit un service par le biais d'une API, qui est requêtée par deux clients.
Pour certaines fonctionnalités, le serveur doit faire des requêtes auprès d'une API publique. Il doit donc embarquer une fonctionnalité de client auprès de l'API publique.
Languages
Le serveur est écrit en Rust. Le composant "client" du serveur, qui requête l'API publique, est également écrit en Rust.
Deux clients sont écrits, un en Rust, l'autre en Python.
Fonctionnalités
- fonction de recherche : l'utilisateur écrit un mot ou une expression, et on fait la requête auprès de Mirabel correspondant :
- exemple :
https://hephaistos.efrei/api/v1/editeur/j*-claude
=>expression = 'j*-claude'
=> recherche SQL locale pour trouver l'ID du ou des éditeurs qui matchent => https://reseau-mirabel.info/api/editeurs/{id} - idem avec
titres
- exemple :
- fonction de stockage de favoris :
- POST /editeur/jean-claude
=>
INSERT INTO favoris VALUES ('jean-claude');
=> réponse 200
- POST /editeur/jean-claude
=>
- fonction de stockage de l'historique de recherche (global pour ne pas devoir gérer les utilisateurs).
- api GET pour retourner les éléments recherchés (historique)
- api GET pour retourner les éléments favoris => retourne des éléments de la base de données, fonction locale donc
Client - Artemis (Python)
Client - Kratos (Rust)
Serveur - Hephaïstos
receive_request
Serveur HTTP enlisten
pour recevoir les requêtes API REST en provenance d'un client (Artemis ou Kratos). Envoie l'URL reçu àparse_url
.parse_url
Reçoit l'URL parreceive_request
et détermine la fonction à appeler.get_data
Reçoit les informations de la part deparse_given_url
, et fait les choses suivantes :- Requête
sql_cache
pour trouver les données localement. - S'il les trouve, envoie les données à
transform_to_json
- S'il ne les trouve pas, requête
api_client
et attend le retour (booléen qui lui indique que l'écriture a fonctionné) - Une fois le retour positif, nouvelle requête
sql_cache
, puis idem, si donnée absente etc. Le tout peut être mis dans une bouclewhile not sql_content
.
- Requête
sql_cache
Base de données SQL qui sert de cache local et qui est requêtée parget_data
(lecture) etapi_client
(écriture).api_client
Effectue les requêtes d'API REST auprès de VirusTotal. Quand il reçoit des données valides, il les ajoute àsql_cache
. Retourne un booléen pour indiquer le succès ou l'échec de l'insert
.transform_to_json
Fonction qui reçoit des données en provenance deget_data
pour en faire du JSON et les envoie àsend_data
.send_data
Envoie les données au client (Artemis ou Kratos).