MediaTekDocuments/MediaTekDocuments/dal/Access.cs
2026-03-24 21:08:18 +01:00

331 lines
12 KiB
C#

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;
namespace MediaTekDocuments.dal
{
/// <summary>
/// Classe d'accès aux données
/// </summary>
public class Access
{
/// <summary>
/// adresse de l'API
/// </summary>
private static readonly string uriApi = "http://localhost/rest_mediatekdocuments/";
/// <summary>
/// instance unique de la classe
/// </summary>
private static Access instance = null;
/// <summary>
/// instance de ApiRest pour envoyer des demandes vers l'api et recevoir la réponse
/// </summary>
private readonly ApiRest api = null;
/// <summary>
/// méthode HTTP pour select
/// </summary>
private const string GET = "GET";
/// <summary>
/// méthode HTTP pour insert
/// </summary>
private const string POST = "POST";
/// <summary>
/// méthode HTTP pour update
///
/// <summary>
/// méthode HTTP pour delete
/// </summary>
private const string DELETE = "DELETE";
/// <summary>
/// Méthode privée pour créer un singleton
/// initialise l'accès à l'API
/// </summary>
private Access()
{
String authenticationString;
try
{
authenticationString = "admin:adminpwd";
api = ApiRest.GetInstance(uriApi, authenticationString);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Environment.Exit(0);
}
}
/// <summary>
/// Création et retour de l'instance unique de la classe
/// </summary>
/// <returns>instance unique de la classe</returns>
public static Access GetInstance()
{
if(instance == null)
{
instance = new Access();
}
return instance;
}
/// <summary>
/// Retourne tous les genres à partir de la BDD
/// </summary>
/// <returns>Liste d'objets Genre</returns>
public List<Categorie> GetAllGenres()
{
IEnumerable<Genre> lesGenres = TraitementRecup<Genre>(GET, "genre", null);
return new List<Categorie>(lesGenres);
}
/// <summary>
/// Retourne tous les rayons à partir de la BDD
/// </summary>
/// <returns>Liste d'objets Rayon</returns>
public List<Categorie> GetAllRayons()
{
IEnumerable<Rayon> lesRayons = TraitementRecup<Rayon>(GET, "rayon", null);
return new List<Categorie>(lesRayons);
}
/// <summary>
/// Retourne toutes les catégories de public à partir de la BDD
/// </summary>
/// <returns>Liste d'objets Public</returns>
public List<Categorie> GetAllPublics()
{
IEnumerable<Public> lesPublics = TraitementRecup<Public>(GET, "public", null);
return new List<Categorie>(lesPublics);
}
/// <summary>
/// Retourne toutes les livres à partir de la BDD
/// </summary>
/// <returns>Liste d'objets Livre</returns>
public List<Livre> GetAllLivres()
{
List<Livre> lesLivres = TraitementRecup<Livre>(GET, "livre", null);
return lesLivres;
}
/// <summary>
/// Retourne toutes les dvd à partir de la BDD
/// </summary>
/// <returns>Liste d'objets Dvd</returns>
public List<Dvd> GetAllDvd()
{
List<Dvd> lesDvd = TraitementRecup<Dvd>(GET, "dvd", null);
return lesDvd;
}
/// <summary>
/// Retourne toutes les revues à partir de la BDD
/// </summary>
/// <returns>Liste d'objets Revue</returns>
public List<Revue> GetAllRevues()
{
List<Revue> lesRevues = TraitementRecup<Revue>(GET, "revue", null);
return lesRevues;
}
/// <summary>
/// Retourne les exemplaires d'une revue
/// </summary>
/// <param name="idDocument">id de la revue concernée</param>
/// <returns>Liste d'objets Exemplaire</returns>
public List<Exemplaire> GetExemplairesRevue(string idDocument)
{
String jsonIdDocument = convertToJson("id", idDocument);
List<Exemplaire> lesExemplaires = TraitementRecup<Exemplaire>(GET, "exemplaire/" + jsonIdDocument, null);
return lesExemplaires;
}
/// <summary>
/// ecriture d'un exemplaire en base de données
/// </summary>
/// <param name="exemplaire">exemplaire à insérer</param>
/// <returns>true si l'insertion a pu se faire (retour != null)</returns>
public bool CreerExemplaire(Exemplaire exemplaire)
{
String jsonExemplaire = JsonConvert.SerializeObject(exemplaire, new CustomDateTimeConverter());
try
{
List<Exemplaire> liste = TraitementRecup<Exemplaire>(POST, "exemplaire", "champs=" + jsonExemplaire);
return (liste != null);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return false;
}
/// <summary>
/// Traitement de la récupération du retour de l'api, avec conversion du json en liste pour les select (GET)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="methode">verbe HTTP (GET, POST, PUT, DELETE)</param>
/// <param name="message">information envoyée dans l'url</param>
/// <param name="parametres">paramètres à envoyer dans le body, au format "chp1=val1&chp2=val2&..."</param>
/// <returns>liste d'objets récupérés (ou liste vide)</returns>
private List<T> TraitementRecup<T> (String methode, String message, String parametres)
{
// trans
List<T> liste = new List<T>();
try
{
JObject retour = api.RecupDistant(methode, message, parametres);
// extraction du code retourné
String code = (String)retour["code"];
if (code.Equals("200"))
{
// dans le cas du GET (select), récupération de la liste d'objets
if (methode.Equals(GET))
{
String resultString = JsonConvert.SerializeObject(retour["result"]);
// construction de la liste d'objets à partir du retour de l'api
liste = JsonConvert.DeserializeObject<List<T>>(resultString, new CustomBooleanJsonConverter());
}
}
else
{
Console.WriteLine("code erreur = " + code + " message = " + (String)retour["message"]);
}
}catch(Exception e)
{
Console.WriteLine("Erreur lors de l'accès à l'API : "+e.Message);
Environment.Exit(0);
}
return liste;
}
/// <summary>
/// Convertit en json un couple nom/valeur
/// </summary>
/// <param name="nom"></param>
/// <param name="valeur"></param>
/// <returns>couple au format json</returns>
private String convertToJson(Object nom, Object valeur)
{
Dictionary<Object, Object> dictionary = new Dictionary<Object, Object>();
dictionary.Add(nom, valeur);
return JsonConvert.SerializeObject(dictionary);
}
/// <summary>
/// Modification du convertisseur Json pour gérer le format de date
/// </summary>
private sealed class CustomDateTimeConverter : IsoDateTimeConverter
{
public CustomDateTimeConverter()
{
base.DateTimeFormat = "yyyy-MM-dd";
}
}
/// <summary>
/// Modification du convertisseur Json pour prendre en compte les booléens
/// classe trouvée sur le site :
/// https://www.thecodebuzz.com/newtonsoft-jsonreaderexception-could-not-convert-string-to-boolean/
/// </summary>
private sealed class CustomBooleanJsonConverter : JsonConverter<bool>
{
public override bool ReadJson(JsonReader reader, Type objectType, bool existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return Convert.ToBoolean(reader.ValueType == typeof(string) ? Convert.ToByte(reader.Value) : reader.Value);
}
public override void WriteJson(JsonWriter writer, bool value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
/// <summary>
/// Récupère les commandes d'un document (livre ou dvd)
/// </summary>
/// <param name="idDocument">ID du document concerné</param>
/// <returns>Liste des commandes du document</returns>
public List<CommandeDocument> GetCommandesDocument(string idDocument)
{
string jsonId = "{\"id\":\"" + idDocument + "\"}";
List<CommandeDocument> lesCommandes = TraitementRecup<CommandeDocument>(GET, "commandelivre/" + jsonId, null);
return lesCommandes;
}
public bool DeleteCommande(string idCommande)
{
String jsonIdCommande = convertToJson("id", idCommande);
try
{
JObject retour = api.RecupDistant("DELETE", "commande/" + jsonIdCommande, null);
return (retour["code"].ToString().Equals("200"));
}
catch (Exception ex)
{
Console.WriteLine("Erreur lors de la suppression : " + ex.Message);
return false;
}
}
public List<Categorie> GetAllSuivis()
{
IEnumerable<Categorie> lesSuivis = TraitementRecup<Categorie>(GET, "suivi", null);
return new List<Categorie>(lesSuivis);
}
public bool CreerCommande(CommandeDocument commande)
{
String jsonExemplaire = JsonConvert.SerializeObject(commande, new CustomDateTimeConverter());
try
{
List<Exemplaire> liste = TraitementRecup<Exemplaire>(POST, "commandedocument", "champs=" + jsonExemplaire);
return (liste != null);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return false;
}
public string GetNextCommandeId()
{
List<dynamic> result = TraitementRecup<dynamic>(GET, "maxcommande", null);
if (result != null && result.Count > 0 && result[0].maxId != null)
{
string lastId = result[0].maxId.ToString();
int nextIdVal = int.Parse(lastId.Substring(1)) + 1;
return "" + nextIdVal.ToString("D4");
}
return "0001";
}
public bool UpdateSuiviCommande(string idCommande, string idSuivi)
{
String jsonSuivi = convertToJson("idSuivi", idSuivi);
try
{
// Appel PUT : http://localhost/rest_mediatekdocuments/commandedocument/C0001
JObject retour = api.RecupDistant("PUT", "commandedocument/" + idCommande, "champs=" + jsonSuivi);
return (retour["code"].ToString().Equals("200"));
}
catch (Exception ex)
{
Console.WriteLine("Erreur mise à jour suivi : " + ex.Message);
return false;
}
}
}
}