using System;
using System.Collections.Generic;
using MediaTekDocuments.model;
using MediaTekDocuments.manager;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System.Configuration;
using System.Linq;
using Serilog;
namespace MediaTekDocuments.dal
{
///
/// Classe d'accès aux données
///
public class Access
{
///
/// instance unique de la classe
///
private static Access instance = null;
///
/// instance de ApiRest pour envoyer des demandes vers l'api et recevoir la réponse
///
private readonly ApiRest api = null;
///
/// méthode HTTP pour select
///
private const string GET = "GET";
///
/// méthode HTTP pour insert
///
private const string POST = "POST";
///
/// méthode HTTP pour update
///
///
/// méthode HTTP pour delete
///
private const string DELETE = "DELETE";
///
/// Méthode privée pour créer un singleton
/// initialise l'accès à l'API
///
// Le constructeur redevient sans paramètre pour le Singleton
private Access()
{
string authenticationString;
string uriApi;
Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day).CreateLogger();
try
{
uriApi = ConfigurationManager.AppSettings["ApiUri"];
authenticationString = ConfigurationManager.AppSettings["ApiAuthentication"];
api = ApiRest.GetInstance(uriApi, authenticationString);
Log.Information("Log de : {NomMethode} : {Message}", nameof(Access), "Api instanciée");
}
catch (Exception e)
{
Log.Fatal(e, "Erreur fatale lors de l'initialisation de l'accès API");
Environment.Exit(0);
}
}
public static Access GetInstance()
{
if (instance == null)
{
// On appelle le constructeur sans argument
instance = new Access();
}
return instance;
}
///
/// Retourne tous les genres à partir de la BDD
///
/// Liste d'objets Genre
public List GetAllGenres()
{
IEnumerable lesGenres = TraitementRecup(GET, "genre", null);
return new List(lesGenres);
}
///
/// Retourne tous les rayons à partir de la BDD
///
/// Liste d'objets Rayon
public List GetAllRayons()
{
IEnumerable lesRayons = TraitementRecup(GET, "rayon", null);
return new List(lesRayons);
}
///
/// Retourne toutes les catégories de public à partir de la BDD
///
/// Liste d'objets Public
public List GetAllPublics()
{
IEnumerable lesPublics = TraitementRecup(GET, "public", null);
return new List(lesPublics);
}
///
/// Retourne toutes les livres à partir de la BDD
///
/// Liste d'objets Livre
public List GetAllLivres()
{
List lesLivres = TraitementRecup(GET, "livre", null);
return lesLivres;
}
///
/// Retourne toutes les dvd à partir de la BDD
///
/// Liste d'objets Dvd
public List GetAllDvd()
{
List lesDvd = TraitementRecup(GET, "dvd", null);
return lesDvd;
}
///
/// Retourne toutes les revues à partir de la BDD
///
/// Liste d'objets Revue
public List GetAllRevues()
{
List lesRevues = TraitementRecup(GET, "revue", null);
return lesRevues;
}
///
/// Retourne les exemplaires d'une revue
///
/// id de la revue concernée
/// Liste d'objets Exemplaire
public List GetExemplairesRevue(string idDocument)
{
String jsonIdDocument = convertToJson("id", idDocument);
List lesExemplaires = TraitementRecup(GET, "exemplaire/" + jsonIdDocument, null);
return lesExemplaires;
}
///
/// ecriture d'un exemplaire en base de données
///
/// exemplaire à insérer
/// true si l'insertion a pu se faire (retour != null)
public bool CreerExemplaire(Exemplaire exemplaire)
{
String jsonExemplaire = JsonConvert.SerializeObject(exemplaire, new CustomDateTimeConverter());
try
{
List liste = TraitementRecup(POST, "exemplaire", "champs=" + jsonExemplaire);
return (liste != null);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(CreerExemplaire), ex.Message);
}
return false;
}
///
/// Traitement de la récupération du retour de l'api, avec conversion du json en liste pour les select (GET)
///
///
/// verbe HTTP (GET, POST, PUT, DELETE)
/// information envoyée dans l'url
/// paramètres à envoyer dans le body, au format "chp1=val1&chp2=val2&..."
/// liste d'objets récupérés (ou liste vide)
private List TraitementRecup (String methode, String message, String parametres)
{
// trans
List liste = new List();
try
{
JObject retour = api.RecupDistant(methode, message, parametres);
// extraction du code retourné
String code = (String)retour["code"];
if (code.Equals("200"))
{
if (methode.Equals(GET))
{
String resultString = JsonConvert.SerializeObject(retour["result"]);
liste = JsonConvert.DeserializeObject>(resultString, new CustomBooleanJsonConverter());
}
}
else
{
Console.WriteLine("code erreur = " + code + " message = " + (String)retour["message"]);
Log.Warning("API Retourne une erreur - Code: {Code}, Message: {Message}", code, (string)retour["message"]);
}
}catch(Exception e)
{
Console.WriteLine("Erreur lors de l'accès à l'API : "+e.Message);
Log.Error(e, "Erreur lors de l'accès à l'API via TraitementRecup");
Environment.Exit(0);
}
return liste;
}
///
/// Convertit en json un couple nom/valeur
///
///
///
/// couple au format json
private String convertToJson(Object nom, Object valeur)
{
Dictionary