Compare commits

...

11 commits

30 changed files with 1315 additions and 230 deletions

2
.gitignore vendored
View file

@ -361,3 +361,5 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/docs/tools
/docs/phpdoc.dist.xml

View file

@ -1,16 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<appSettings>
<add key="ApiAuthentication" value="admin:adminpwd" />
<add key="ApiUri" value="http://localhost/rest_mediatekdocuments/" />
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.34.1.0" newVersion="3.34.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="K4os.Compression.LZ4.Streams" publicKeyToken="2186fa9121ef231d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.3.8.0" newVersion="1.3.8.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Serilog" publicKeyToken="24c2f752a8e58a10" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View file

@ -12,6 +12,8 @@
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -22,6 +24,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\MediaTekDocuments.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -33,20 +36,94 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="BouncyCastle.Crypto, Version=1.8.5.0, Culture=neutral, PublicKeyToken=0e99375e54769942" />
<Reference Include="Google.Protobuf, Version=3.19.4.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604" />
<Reference Include="K4os.Compression.LZ4.Streams, Version=1.2.6.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d" />
<Reference Include="MySql.Data, Version=8.0.29.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" />
<Reference Include="BouncyCastle.Crypto, Version=1.8.5.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
<HintPath>..\packages\BouncyCastle.Cryptography.2.6.2\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf, Version=3.34.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Protobuf.3.34.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="K4os.Compression.LZ4, Version=1.3.8.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL">
<HintPath>..\packages\K4os.Compression.LZ4.1.3.8\lib\net462\K4os.Compression.LZ4.dll</HintPath>
</Reference>
<Reference Include="K4os.Compression.LZ4.Streams, Version=1.3.8.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL">
<HintPath>..\packages\K4os.Compression.LZ4.Streams.1.3.8\lib\net462\K4os.Compression.LZ4.Streams.dll</HintPath>
</Reference>
<Reference Include="K4os.Hash.xxHash, Version=1.0.8.0, Culture=neutral, PublicKeyToken=32cd54395057cec3, processorArchitecture=MSIL">
<HintPath>..\packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.5.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="MySql.Data, Version=8.0.29.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.29\lib\net452\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Serilog, Version=4.3.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
<HintPath>..\packages\Serilog.4.3.1\lib\net471\Serilog.dll</HintPath>
</Reference>
<Reference Include="Serilog.Sinks.File, Version=7.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
<HintPath>..\packages\Serilog.Sinks.File.7.0.0\lib\net471\Serilog.Sinks.File.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
<Reference Include="System.Configuration.ConfigurationManager, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Configuration.ConfigurationManager.8.0.0\lib\net462\System.Configuration.ConfigurationManager.dll</HintPath>
</Reference>
<Reference Include="System.Configuration.Install" />
<Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=8.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.IO.Pipelines, Version=5.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Pipelines.5.0.2\lib\net461\System.IO.Pipelines.dll</HintPath>
</Reference>
<Reference Include="System.Management" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net" />
<Reference Include="System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.2.0.20126.16343\lib\net40\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.Formatting.Extension.5.2.3.0\lib\System.Net.Http.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.Formatting.Extension.5.2.3.0\lib\System.Net.Http.Formatting.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Primitives, Version=4.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.Formatting.Extension.5.2.3.0\lib\System.Net.Http.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.2.0.20126.16343\lib\net40\System.Net.Http.WebRequest.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Channels, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Channels.8.0.0\lib\net462\System.Threading.Channels.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Transactions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
@ -54,11 +131,17 @@
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="Ubiety.Dns.Core, Version=2.2.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
<Reference Include="ZstdNet, Version=1.4.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
<Reference Include="Ubiety.Dns.Core, Version=2.2.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.29\lib\net452\Ubiety.Dns.Core.dll</HintPath>
</Reference>
<Reference Include="ZstdNet, Version=1.4.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.29\lib\net452\ZstdNet.dll</HintPath>
</Reference>
<Reference Include="ZstdSharp, Version=0.8.6.0, Culture=neutral, PublicKeyToken=8d151af33a4ad5cf, processorArchitecture=MSIL">
<HintPath>..\packages\ZstdSharp.Port.0.8.6\lib\net462\ZstdSharp.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="controller\FrmAuthController.cs" />
@ -124,4 +207,13 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\ZstdNet.1.4.5\build\ZstdNet.targets" Condition="Exists('..\packages\ZstdNet.1.4.5\build\ZstdNet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Ce projet fait référence à des packages NuGet qui sont manquants sur cet ordinateur. Utilisez l'option de restauration des packages NuGet pour les télécharger. Pour plus d'informations, consultez http://go.microsoft.com/fwlink/?LinkID=322105. Le fichier manquant est : {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\ZstdNet.1.4.5\build\ZstdNet.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ZstdNet.1.4.5\build\ZstdNet.targets'))" />
<Error Condition="!Exists('..\packages\Serilog.4.3.1\build\Serilog.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Serilog.4.3.1\build\Serilog.targets'))" />
</Target>
<Import Project="..\packages\Serilog.4.3.1\build\Serilog.targets" Condition="Exists('..\packages\Serilog.4.3.1\build\Serilog.targets')" />
</Project>

View file

@ -15,7 +15,6 @@ namespace MediaTekDocuments
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new FrmAuth());
FrmAuth auth = new FrmAuth();
if (auth.ShowDialog() == DialogResult.OK)

View file

@ -5,15 +5,30 @@ using System;
namespace MediaTekDocuments.controller
{
/// <summary>
/// Contrôleur pour la fenêtre d'authentification
/// </summary>
class FrmAuthController
{
/// <summary>
/// Objet d'accès aux données
/// </summary>
private readonly Access access;
/// <summary>
/// Constructeur : récupère l'instance unique d'accès aux données
/// </summary>
public FrmAuthController()
{
access = Access.GetInstance();
}
/// <summary>
/// Vérifie les identifiants de connexion
/// </summary>
/// <param name="login">Identifiant de l'utilisateur</param>
/// <param name="pwd">Mot de passe de l'utilisateur</param>
/// <returns>Objet Utilisateur si connexion réussie, null sinon</returns>
public Utilisateur GetConnection(string login, string pwd)
{
return access.GetConnection(login, pwd);

View file

@ -98,46 +98,90 @@ namespace MediaTekDocuments.controller
return access.CreerExemplaire(exemplaire);
}
/// <summary>
/// Récupère les commandes d'un document
/// </summary>
/// <param name="idDocument">Identifiant du document</param>
/// <returns>Liste des commandes du document</returns>
public List<CommandeDocument> GetCommandesDocument(string idDocument)
{
return Access.GetInstance().GetCommandesDocument(idDocument);
}
/// <summary>
/// Supprime une commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerCommandeDocument(CommandeDocument commande)
{
return Access.GetInstance().DeleteCommande(commande.Id);
}
/// <summary>
/// Récupère la liste des suivis
/// </summary>
/// <returns>Liste d'objets Categorie (suivi)</returns>
public List<Categorie> GetAllSuivis()
{
return Access.GetInstance().GetAllSuivis();
}
/// <summary>
/// Crée une nouvelle commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool createCommande(CommandeDocument commande)
{
return access.CreerCommande(commande);
}
/// <summary>
/// Récupère le prochain identifiant de commande
/// </summary>
/// <returns>Identifiant de commande formaté</returns>
public string GetNextCommandeId()
{
return access.GetNextCommandeId();
}
/// <summary>
/// Met à jour l'état de suivi d'une commande
/// </summary>
/// <param name="idCommande">Identifiant de la commande</param>
/// <param name="idSuivi">Identifiant du nouvel état de suivi</param>
/// <returns>True si la mise à jour a pu se faire</returns>
public bool UpdateSuiviCommande(string idCommande, string idSuivi)
{
return access.UpdateSuiviCommande(idCommande, idSuivi);
}
/// <summary>
/// Récupère les abonnements d'une revue
/// </summary>
/// <param name="idRevue">Identifiant de la revue</param>
/// <returns>Liste des abonnements de la revue</returns>
public List<Abonnement> GetAbonnements(string idRevue)
{
return access.GetAbonnements(idRevue);
}
/// <summary>
/// Crée un nouvel abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerAbonnement(Abonnement abonnement)
{
return access.CreerAbonnement(abonnement);
}
/// <summary>
/// Supprime un abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerAbonnement(Abonnement abonnement)
{
return access.SupprimerAbonnement(abonnement.Id);

View file

@ -7,6 +7,7 @@ using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System.Configuration;
using System.Linq;
using Serilog;
namespace MediaTekDocuments.dal
{
@ -15,10 +16,6 @@ namespace MediaTekDocuments.dal
/// </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>
@ -37,7 +34,8 @@ namespace MediaTekDocuments.dal
private const string POST = "POST";
/// <summary>
/// méthode HTTP pour update
///
/// </summary>
private const string PUT = "PUT";
/// <summary>
/// méthode HTTP pour delete
@ -48,17 +46,25 @@ namespace MediaTekDocuments.dal
/// Méthode privée pour créer un singleton
/// initialise l'accès à l'API
/// </summary>
// Le constructeur redevient sans paramètre pour le Singleton
private Access()
{
String authenticationString;
string authenticationString;
string uriApi;
Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day).CreateLogger();
try
{
authenticationString = "admin:adminpwd";
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)
{
Console.WriteLine(e.Message);
Log.Fatal(e, "Erreur fatale lors de l'initialisation de l'accès API");
Environment.Exit(0);
}
}
@ -69,8 +75,9 @@ namespace MediaTekDocuments.dal
/// <returns>instance unique de la classe</returns>
public static Access GetInstance()
{
if(instance == null)
if (instance == null)
{
// On appelle le constructeur sans argument
instance = new Access();
}
return instance;
@ -165,6 +172,7 @@ namespace MediaTekDocuments.dal
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(CreerExemplaire), ex.Message);
}
return false;
}
@ -188,21 +196,21 @@ namespace MediaTekDocuments.dal
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"]);
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;
@ -263,6 +271,11 @@ namespace MediaTekDocuments.dal
return lesCommandes;
}
/// <summary>
/// Supprime une commande
/// </summary>
/// <param name="idCommande">ID de la commande à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool DeleteCommande(string idCommande)
{
@ -274,17 +287,26 @@ namespace MediaTekDocuments.dal
}
catch (Exception ex)
{
Console.WriteLine("Erreur lors de la suppression : " + ex.Message);
Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(DeleteCommande), ex.Message);
return false;
}
}
/// <summary>
/// Récupère la liste des suivis
/// </summary>
/// <returns>Liste des suivis</returns>
public List<Categorie> GetAllSuivis()
{
IEnumerable<Categorie> lesSuivis = TraitementRecup<Categorie>(GET, "suivi", null);
return new List<Categorie>(lesSuivis);
}
/// <summary>
/// Crée une commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerCommande(CommandeDocument commande)
{
String jsonExemplaire = JsonConvert.SerializeObject(commande, new CustomDateTimeConverter());
@ -295,23 +317,40 @@ namespace MediaTekDocuments.dal
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Log.Error(ex, "Erreur lors de la création de commande");
}
return false;
}
/// <summary>
/// Récupère le prochain identifiant de commande
/// </summary>
/// <returns>Prochain ID de commande au format string</returns>
public string GetNextCommandeId()
{
List<dynamic> result = TraitementRecup<dynamic>(GET, "maxcommande", null);
if (result != null && result.Count > 0 && result[0].maxId != null)
if (result != null && result.Count > 0)
{
string lastId = result[0].maxId.ToString();
int nextIdVal = int.Parse(lastId.Substring(1)) + 1;
return "" + nextIdVal.ToString("D4");
var firstResult = result[0];
if (firstResult != null && firstResult.maxId != null)
{
string lastId = firstResult.maxId.ToString();
if (lastId.Length > 1)
{
int nextIdVal = int.Parse(lastId.Substring(1)) + 1;
return nextIdVal.ToString("D4");
}
}
}
return "0001";
}
/// <summary>
/// Met à jour le suivi d'une commande
/// </summary>
/// <param name="idCommande">ID de la commande</param>
/// <param name="idSuivi">Nouvel ID de suivi</param>
/// <returns>True si la mise à jour a pu se faire</returns>
public bool UpdateSuiviCommande(string idCommande, string idSuivi)
{
String jsonSuivi = convertToJson("idSuivi", idSuivi);
@ -323,17 +362,27 @@ namespace MediaTekDocuments.dal
}
catch (Exception ex)
{
Console.WriteLine("Erreur mise à jour suivi : " + ex.Message);
Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(UpdateSuiviCommande), ex.Message);
return false;
}
}
/// <summary>
/// Récupère les abonnements d'une revue
/// </summary>
/// <param name="idRevue">ID de la revue</param>
/// <returns>Liste des abonnements</returns>
public List<Abonnement> GetAbonnements(string idRevue)
{
string jsonIdRevue = convertToJson("id", idRevue);
return TraitementRecup<Abonnement>(GET, "commanderevue/" + jsonIdRevue, null);
}
/// <summary>
/// Crée un abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerAbonnement(Abonnement abonnement)
{
string jsonAbonnement = JsonConvert.SerializeObject(abonnement, new CustomDateTimeConverter());
@ -345,11 +394,16 @@ namespace MediaTekDocuments.dal
}
catch (Exception ex)
{
Console.WriteLine("Erreur lors de l'accès à l'API : " + ex.Message);
Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(GetAbonnements), ex.Message);
return false;
}
}
/// <summary>
/// Supprime un abonnement
/// </summary>
/// <param name="idAbonnement">ID de l'abonnement à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerAbonnement(string idAbonnement)
{
string jsonId = convertToJson("id", idAbonnement);
@ -358,9 +412,18 @@ namespace MediaTekDocuments.dal
JObject retour = api.RecupDistant(DELETE, "abonnement/" + jsonId, null);
return retour["code"].ToString().Equals("200");
}
catch { return false; }
catch(Exception ex) {
Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(SupprimerAbonnement), ex.Message);
return false;
}
}
/// <summary>
/// Tente de connecter un utilisateur
/// </summary>
/// <param name="login">Login de l'utilisateur</param>
/// <param name="pwd">Mot de passe de l'utilisateur</param>
/// <returns>Objet Utilisateur si connecté, null sinon</returns>
public Utilisateur GetConnection(string login, string pwd)
{
Dictionary<string, string> loginInfo = new Dictionary<string, string>
@ -376,6 +439,7 @@ namespace MediaTekDocuments.dal
{
return lesUtilisateurs[0];
}
Log.Warning("Tentative de connexion échouée pour le login : {Login}", login);
return null;
}
}

View file

@ -43,7 +43,7 @@ namespace MediaTekDocuments.manager
/// </summary>
/// <param name="uriApi">adresse de l'api</param>
/// <param name="authenticationString">chaîne d'authentificatio (login:pwd)</param>
/// <returns></returns>
/// <returns>Instance unique de la classe ApiRest</returns>
public static ApiRest GetInstance(String uriApi, String authenticationString)
{
if(instance == null)

View file

@ -1,15 +1,41 @@
using System;
using System;
namespace MediaTekDocuments.model
{
/// <summary>
/// Classe métier Abonnement (contient les informations sur un abonnement à une revue)
/// </summary>
public class Abonnement
{
/// <summary>
/// Obtient ou définit l'identifiant de l'abonnement
/// </summary>
public string Id { get; set; }
/// <summary>
/// Obtient ou définit la date de la commande
/// </summary>
public DateTime DateCommande { get; set; }
/// <summary>
/// Obtient ou définit le montant de l'abonnement
/// </summary>
public double Montant { get; set; }
/// <summary>
/// Obtient ou définit la date de fin de l'abonnement
/// </summary>
public DateTime DateFinAbonnement { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de la revue associée
/// </summary>
public string IdRevue { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Abonnement"/>
/// </summary>
/// <param name="id">Identifiant de l'abonnement</param>
/// <param name="dateCommande">Date de la commande</param>
/// <param name="montant">Montant de l'abonnement</param>
/// <param name="dateFinAbonnement">Date de fin de l'abonnement</param>
/// <param name="idRevue">Identifiant de la revue associée</param>
public Abonnement(string id, DateTime dateCommande, double montant, DateTime dateFinAbonnement, string idRevue)
{
this.Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,9 +6,20 @@ namespace MediaTekDocuments.model
/// </summary>
public class Categorie
{
/// <summary>
/// Obtient l'identifiant de la catégorie
/// </summary>
public string Id { get; }
/// <summary>
/// Obtient le libellé de la catégorie
/// </summary>
public string Libelle { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Categorie"/>
/// </summary>
/// <param name="id">Identifiant de la catégorie</param>
/// <param name="libelle">Libellé de la catégorie</param>
public Categorie(string id, string libelle)
{
this.Id = id;
@ -18,7 +29,7 @@ namespace MediaTekDocuments.model
/// <summary>
/// Récupération du libellé pour l'affichage dans les combos
/// </summary>
/// <returns>Libelle</returns>
/// <returns>Le libellé de la catégorie</returns>
public override string ToString()
{
return this.Libelle;

View file

@ -1,17 +1,51 @@
using System;
using System;
namespace MediaTekDocuments.model
{
/// <summary>
/// Classe métier CommandeDocument (contient les informations sur une commande de livres ou de DVD)
/// </summary>
public class CommandeDocument
{
/// <summary>
/// Obtient ou définit l'identifiant de la commande
/// </summary>
public string Id { get; set; }
/// <summary>
/// Obtient ou définit la date de la commande
/// </summary>
public DateTime DateCommande { get; set; }
/// <summary>
/// Obtient ou définit le montant de la commande
/// </summary>
public double Montant { get; set; }
/// <summary>
/// Obtient ou définit le nombre d'exemplaires commandés
/// </summary>
public int NbExemplaire { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du livre ou DVD associé
/// </summary>
public string IdLivreDvd { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de l'état de suivi de la commande
/// </summary>
public int IdSuivi { get; set; }
/// <summary>
/// Obtient ou définit le libellé de l'état de suivi
/// </summary>
public string LibelleSuivi { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="CommandeDocument"/>
/// </summary>
/// <param name="id">Identifiant de la commande</param>
/// <param name="dateCommande">Date de la commande</param>
/// <param name="montant">Montant de la commande</param>
/// <param name="nbExemplaire">Nombre d'exemplaires</param>
/// <param name="idLivreDvd">Identifiant du document (livre ou dvd)</param>
/// <param name="idSuivi">Identifiant du suivi</param>
/// <param name="libelleSuivi">Libellé du suivi</param>
public CommandeDocument(string id, DateTime dateCommande, double montant, int nbExemplaire, string idLivreDvd, int idSuivi, string libelleSuivi)
{
this.Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,16 +6,55 @@ namespace MediaTekDocuments.model
/// </summary>
public class Document
{
/// <summary>
/// Obtient l'identifiant du document
/// </summary>
public string Id { get; }
/// <summary>
/// Obtient le titre du document
/// </summary>
public string Titre { get; }
/// <summary>
/// Obtient l'URL de l'image du document
/// </summary>
public string Image { get; }
/// <summary>
/// Obtient l'identifiant du genre du document
/// </summary>
public string IdGenre { get; }
/// <summary>
/// Obtient le libellé du genre du document
/// </summary>
public string Genre { get; }
/// <summary>
/// Obtient l'identifiant du public du document
/// </summary>
public string IdPublic { get; }
/// <summary>
/// Obtient le libellé du public du document
/// </summary>
public string Public { get; }
/// <summary>
/// Obtient l'identifiant du rayon du document
/// </summary>
public string IdRayon { get; }
/// <summary>
/// Obtient le libellé du rayon du document
/// </summary>
public string Rayon { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Document"/>
/// </summary>
/// <param name="id">Identifiant du document</param>
/// <param name="titre">Titre du document</param>
/// <param name="image">URL de l'image du document</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Document(string id, string titre, string image, string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
{
Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,10 +6,34 @@ namespace MediaTekDocuments.model
/// </summary>
public class Dvd : LivreDvd
{
/// <summary>
/// Obtient la durée du DVD
/// </summary>
public int Duree { get; }
/// <summary>
/// Obtient le réalisateur du DVD
/// </summary>
public string Realisateur { get; }
/// <summary>
/// Obtient le synopsis du DVD
/// </summary>
public string Synopsis { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Dvd"/>
/// </summary>
/// <param name="id">Identifiant du DVD</param>
/// <param name="titre">Titre du DVD</param>
/// <param name="image">URL de l'image du DVD</param>
/// <param name="duree">Durée du DVD</param>
/// <param name="realisateur">Réalisateur du DVD</param>
/// <param name="synopsis">Synopsis du DVD</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Dvd(string id, string titre, string image, int duree, string realisateur, string synopsis,
string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,9 +6,20 @@ namespace MediaTekDocuments.model
/// </summary>
public class Etat
{
/// <summary>
/// Obtient ou définit l'identifiant de l'état
/// </summary>
public string Id { get; set; }
/// <summary>
/// Obtient ou définit le libellé de l'état
/// </summary>
public string Libelle { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Etat"/>
/// </summary>
/// <param name="id">Identifiant de l'état</param>
/// <param name="libelle">Libellé de l'état</param>
public Etat(string id, string libelle)
{
this.Id = id;

View file

@ -1,4 +1,4 @@
using System;
using System;
namespace MediaTekDocuments.model
{
@ -7,12 +7,35 @@ namespace MediaTekDocuments.model
/// </summary>
public class Exemplaire
{
/// <summary>
/// Obtient ou définit le numéro de l'exemplaire
/// </summary>
public int Numero { get; set; }
/// <summary>
/// Obtient ou définit l'URL de la photo de l'exemplaire
/// </summary>
public string Photo { get; set; }
/// <summary>
/// Obtient ou définit la date d'achat de l'exemplaire
/// </summary>
public DateTime DateAchat { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de l'état de l'exemplaire
/// </summary>
public string IdEtat { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du document associé
/// </summary>
public string Id { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Exemplaire"/>
/// </summary>
/// <param name="numero">Numéro de l'exemplaire</param>
/// <param name="dateAchat">Date d'achat</param>
/// <param name="photo">URL de la photo</param>
/// <param name="idEtat">Identifiant de l'état</param>
/// <param name="idDocument">Identifiant du document</param>
public Exemplaire(int numero, DateTime dateAchat, string photo, string idEtat, string idDocument)
{
this.Numero = numero;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary>
public class Genre : Categorie
{
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Genre"/>
/// </summary>
/// <param name="id">Identifiant du genre</param>
/// <param name="libelle">Libellé du genre</param>
public Genre(string id, string libelle) : base(id, libelle)
{
}

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,10 +6,34 @@ namespace MediaTekDocuments.model
/// </summary>
public class Livre : LivreDvd
{
/// <summary>
/// Obtient l'ISBN du livre
/// </summary>
public string Isbn { get; }
/// <summary>
/// Obtient l'auteur du livre
/// </summary>
public string Auteur { get; }
/// <summary>
/// Obtient la collection du livre
/// </summary>
public string Collection { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Livre"/>
/// </summary>
/// <param name="id">Identifiant du livre</param>
/// <param name="titre">Titre du livre</param>
/// <param name="image">URL de l'image du livre</param>
/// <param name="isbn">ISBN du livre</param>
/// <param name="auteur">Auteur du livre</param>
/// <param name="collection">Collection du livre</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Livre(string id, string titre, string image, string isbn, string auteur, string collection,
string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,6 +6,18 @@ namespace MediaTekDocuments.model
/// </summary>
public abstract class LivreDvd : Document
{
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="LivreDvd"/>
/// </summary>
/// <param name="id">Identifiant du document</param>
/// <param name="titre">Titre du document</param>
/// <param name="image">URL de l'image du document</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
protected LivreDvd(string id, string titre, string image, string idGenre, string genre,
string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary>
public class Public : Categorie
{
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Public"/>
/// </summary>
/// <param name="id">Identifiant du public</param>
/// <param name="libelle">Libellé du public</param>
public Public(string id, string libelle) : base(id, libelle)
{
}

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary>
public class Rayon : Categorie
{
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Rayon"/>
/// </summary>
/// <param name="id">Identifiant du rayon</param>
/// <param name="libelle">Libellé du rayon</param>
public Rayon(string id, string libelle) : base(id, libelle)
{
}

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,9 +6,29 @@ namespace MediaTekDocuments.model
/// </summary>
public class Revue : Document
{
/// <summary>
/// Obtient ou définit la périodicité de la revue
/// </summary>
public string Periodicite { get; set; }
/// <summary>
/// Obtient ou définit le délai de mise à disposition de la revue
/// </summary>
public int DelaiMiseADispo { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Revue"/>
/// </summary>
/// <param name="id">Identifiant de la revue</param>
/// <param name="titre">Titre de la revue</param>
/// <param name="image">URL de l'image de la revue</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
/// <param name="periodicite">Périodicité</param>
/// <param name="delaiMiseADispo">Délai de mise à disposition</param>
public Revue(string id, string titre, string image, string idGenre, string genre,
string idPublic, string lePublic, string idRayon, string rayon,
string periodicite, int delaiMiseADispo)

View file

@ -1,12 +1,42 @@
public class Utilisateur
/// <summary>
/// Classe métier Utilisateur (représente un utilisateur de l'application)
/// </summary>
public class Utilisateur
{
/// <summary>
/// Obtient ou définit l'identifiant technique de l'utilisateur
/// </summary>
public string Id { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de connexion de l'utilisateur
/// </summary>
public string Identifiant { get; set; }
/// <summary>
/// Obtient ou définit le nom de l'utilisateur
/// </summary>
public string Nom { get; set; }
/// <summary>
/// Obtient ou définit le prénom de l'utilisateur
/// </summary>
public string Prenom { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du service de l'utilisateur
/// </summary>
public int IdService { get; set; }
/// <summary>
/// Obtient ou définit le libellé du service de l'utilisateur
/// </summary>
public string LibelleService { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Utilisateur"/>
/// </summary>
/// <param name="id">Identifiant technique</param>
/// <param name="identifiant">Identifiant de connexion</param>
/// <param name="nom">Nom</param>
/// <param name="prenom">Prénom</param>
/// <param name="idService">Identifiant du service</param>
/// <param name="libelleService">Libellé du service</param>
public Utilisateur(string id, string identifiant, string nom, string prenom, int idService, string libelleService)
{
this.Id = id;

View file

@ -1,4 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="BouncyCastle" version="1.8.5" targetFramework="net472" />
<package id="BouncyCastle.Cryptography" version="2.6.2" targetFramework="net472" />
<package id="Google.Protobuf" version="3.34.1" targetFramework="net472" />
<package id="K4os.Compression.LZ4" version="1.3.8" targetFramework="net472" />
<package id="K4os.Compression.LZ4.Streams" version="1.3.8" targetFramework="net472" />
<package id="K4os.Hash.xxHash" version="1.0.8" targetFramework="net472" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="5.0.0" targetFramework="net472" />
<package id="MySql.Data" version="8.0.29" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
<package id="Serilog" version="4.3.1" targetFramework="net472" />
<package id="Serilog.Sinks.File" version="7.0.0" targetFramework="net472" />
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
<package id="System.Configuration.ConfigurationManager" version="8.0.0" targetFramework="net472" />
<package id="System.Diagnostics.DiagnosticSource" version="8.0.1" targetFramework="net472" />
<package id="System.IO.Pipelines" version="5.0.2" targetFramework="net472" />
<package id="System.Memory" version="4.5.5" targetFramework="net472" />
<package id="System.Net.Http" version="2.0.20126.16343" targetFramework="net472" />
<package id="System.Net.Http.Formatting.Extension" version="5.2.3.0" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
<package id="System.Threading.Channels" version="8.0.0" targetFramework="net472" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
<package id="ZstdNet" version="1.4.5" targetFramework="net472" />
<package id="ZstdSharp.Port" version="0.8.6" targetFramework="net472" />
</packages>

View file

@ -1,41 +1,66 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System;
using System.Windows.Forms;
using MediaTekDocuments.model;
using MediaTekDocuments.controller;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;
using System.IO;
namespace MediaTekDocuments.view
{
/// <summary>
/// Fenêtre d'authentification de l'application.
/// Permet à l'utilisateur de se connecter en saisissant ses identifiants.
/// </summary>
public partial class FrmAuth : Form
{
/// <summary>
/// Instance du contrôleur pour la gestion de l'authentification.
/// </summary>
private readonly FrmAuthController controller;
/// <summary>
/// Obtient l'utilisateur authentifié.
/// </summary>
public Utilisateur user { get; private set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="FrmAuth"/>.
/// Configure le contrôleur d'authentification.
/// </summary>
public FrmAuth()
{
InitializeComponent();
this.controller = new FrmAuthController();
}
/// <summary>
/// Gère l'événement de chargement du formulaire.
/// </summary>
/// <param name="sender">La source de l'événement.</param>
/// <param name="e">Les données de l'événement.</param>
private void FrmAuth_Load(object sender, EventArgs e)
{
//
// Méthode laissée vide intentionnellement.
// Aucun traitement spécifique n'est requis au chargement du formulaire d'authentification.
}
/// <summary>
/// Gère le clic sur le bouton de connexion.
/// Vérifie les identifiants et le service de l'utilisateur pour autoriser l'accès.
/// </summary>
/// <param name="sender">La source de l'événement.</param>
/// <param name="e">Les données de l'événement.</param>
private void btnLogin_Click(object sender, EventArgs e)
{
string identifiant = txtIdentifiant.Text;
string password = txtPassword.Text;
Utilisateur user = controller.GetConnection(identifiant, password);
Utilisateur utilisateur = controller.GetConnection(identifiant, password);
if(user == null)
if(utilisateur == null)
{
txtIdentifiant.Text = "";
txtPassword.Text = "";
@ -43,14 +68,15 @@ namespace MediaTekDocuments.view
return;
}
if(user.LibelleService == "Culture")
if(utilisateur.LibelleService == "Culture")
{
MessageBox.Show("Vous n'êtes pas autorisé à accéder à cette application !", "Accès refusé", MessageBoxButtons.OK, MessageBoxIcon.Warning);
this.DialogResult = DialogResult.Abort;
this.Close();
return;
}
this.user = user;
this.user = utilisateur;
this.DialogResult = DialogResult.OK;
this.Close();
}

File diff suppressed because it is too large Load diff

View file

@ -50,10 +50,12 @@
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<Compile Include="documentTest.cs" />
<Compile Include="UnitTest1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>

View file

@ -11,24 +11,26 @@ namespace Mediatek.Tests
[TestMethod]
public void TestParutionDansAbonnement_ValidationDates()
{
FrmMediatek frm = new FrmMediatek();
Utilisateur user = new Utilisateur("1", "admin", "philippe", "erwann", 1, "administration");
FrmMediatek frm = new FrmMediatek(user);
DateTime debut = new DateTime(2024, 01, 01);
DateTime fin = new DateTime(2024, 12, 31);
// Ajout de DateTimeKind.Local à chaque création d'objet DateTime
DateTime debut = new DateTime(2024, 01, 01, 0, 0, 0, DateTimeKind.Local);
DateTime fin = new DateTime(2024, 12, 31, 0, 0, 0, DateTimeKind.Local);
DateTime parutionDebut = new DateTime(2024, 01, 01);
DateTime parutionDebut = new DateTime(2024, 01, 01, 0, 0, 0, DateTimeKind.Local);
Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionDebut), "La date de début devrait être incluse.");
DateTime parutionFin = new DateTime(2024, 12, 31);
DateTime parutionFin = new DateTime(2024, 12, 31, 0, 0, 0, DateTimeKind.Local);
Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionFin), "La date de fin devrait être incluse.");
DateTime parutionMilieu = new DateTime(2024, 06, 15);
DateTime parutionMilieu = new DateTime(2024, 06, 15, 0, 0, 0, DateTimeKind.Local);
Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionMilieu), "Une date en milieu d'abonnement doit être vraie.");
DateTime parutionAvant = new DateTime(2023, 12, 31);
DateTime parutionAvant = new DateTime(2023, 12, 31, 0, 0, 0, DateTimeKind.Local);
Assert.IsFalse(frm.ParutionDansAbonnement(debut, fin, parutionAvant), "Une date avant le début doit être fausse.");
DateTime parutionApres = new DateTime(2025, 01, 01);
DateTime parutionApres = new DateTime(2025, 01, 01, 0, 0, 0, DateTimeKind.Local);
Assert.IsFalse(frm.ParutionDansAbonnement(debut, fin, parutionApres), "Une date après la fin doit être fausse.");
}
}

31
Mediatek.Tests/app.config Normal file
View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.34.1.0" newVersion="3.34.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="K4os.Compression.LZ4.Streams" publicKeyToken="2186fa9121ef231d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.3.8.0" newVersion="1.3.8.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Serilog" publicKeyToken="24c2f752a8e58a10" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View file

@ -0,0 +1,104 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MediaTekDocuments.model;
using System;
namespace Mediatek.Tests
{
[TestClass]
public class ModelTests
{
[TestMethod]
public void TestLivre_Initialization()
{
// Données de test
string id = "001";
string titre = "Le Seigneur des Anneaux";
string image = "image.jpg";
string isbn = "123456";
string auteur = "J.R.R. Tolkien";
string collection = "Pocket";
string idGenre = "G01";
string genre = "Fantastique";
string idPublic = "P01";
string lePublic = "Adulte";
string idRayon = "R01";
string rayon = "Rayon 1";
// Instanciation
Livre livre = new Livre(id, titre, image, isbn, auteur, collection, idGenre, genre, idPublic, lePublic, idRayon, rayon);
// Assertions
Assert.AreEqual(id, livre.Id);
Assert.AreEqual(titre, livre.Titre);
Assert.AreEqual(auteur, livre.Auteur);
Assert.AreEqual(isbn, livre.Isbn);
Assert.AreEqual(genre, livre.Genre);
}
[TestMethod]
public void TestRevue_Initialization()
{
Revue revue = new Revue("003", "Science et Vie", "img.jpg", "G03", "Science", "P01", "Adulte", "R03", "Rayon 3", "Mensuel", 15);
Assert.AreEqual("003", revue.Id);
Assert.AreEqual("Science et Vie", revue.Titre);
Assert.AreEqual("Mensuel", revue.Periodicite);
Assert.AreEqual(15, revue.DelaiMiseADispo);
}
}
[TestClass]
public class CommandeModelTests
{
[TestMethod]
public void TestAbonnement_Initialization()
{
string id = "A001";
DateTime dateCommande = new DateTime(2023, 10, 01, 0, 0, 0, DateTimeKind.Local);
double montant = 50.5;
DateTime dateFin = new DateTime(2024, 10, 01, 0, 0, 0, DateTimeKind.Local);
string idRevue = "R001";
Abonnement abo = new Abonnement(id, dateCommande, montant, dateFin, idRevue);
Assert.AreEqual(id, abo.Id);
Assert.AreEqual(montant, abo.Montant);
Assert.AreEqual(dateFin, abo.DateFinAbonnement);
Assert.AreEqual(idRevue, abo.IdRevue);
}
[TestMethod]
public void TestCommandeDocument_Initialization()
{
CommandeDocument cmd = new CommandeDocument("C001", DateTime.Now, 25.0, 5, "L001", 1, "En cours");
Assert.AreEqual(5, cmd.NbExemplaire);
Assert.AreEqual("L001", cmd.IdLivreDvd);
Assert.AreEqual("En cours", cmd.LibelleSuivi);
}
}
[TestClass]
public class SystemModelTests
{
[TestMethod]
public void TestUtilisateur_Initialization()
{
Utilisateur user = new Utilisateur("1", "jdupont", "dupont", "Jean", 2, "Prêts");
Assert.AreEqual("jdupont", user.Identifiant);
Assert.AreEqual("Jean", user.Prenom);
Assert.AreEqual("Prêts", user.LibelleService);
}
[TestMethod]
public void TestEtat_Initialization()
{
Etat etat = new Etat("00001", "Neuf");
Assert.AreEqual("00001", etat.Id);
Assert.AreEqual("Neuf", etat.Libelle);
}
}
}

157
docs/index.html Normal file
View file

@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documentation Technique - MediaTekDocuments</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; margin: 0; display: flex; }
nav { width: 300px; background: #f4f4f4; border-right: 1px solid #ddd; height: 100vh; overflow-y: auto; position: fixed; padding: 20px; }
main { margin-left: 340px; padding: 40px; max-width: 1000px; }
h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }
h2 { color: #2980b9; margin-top: 40px; border-bottom: 1px solid #eee; }
h3 { color: #16a085; background: #f9f9f9; padding: 5px 10px; border-left: 4px solid #16a085; }
.namespace { font-weight: bold; color: #7f8c8d; text-transform: uppercase; font-size: 0.9em; }
table { width: 100%; border-collapse: collapse; margin: 20px 0; }
th, td { text-align: left; padding: 12px; border: 1px solid #ddd; }
th { background: #f2f2f2; }
code { background: #f8f8f8; padding: 2px 5px; border-radius: 3px; font-family: Consolas, Monaco, 'Andale Mono', monospace; }
.summary { font-style: italic; color: #555; margin-bottom: 15px; }
ul { list-style-type: none; padding: 0; }
nav ul li { margin-bottom: 8px; }
nav a { text-decoration: none; color: #34495e; font-size: 0.95em; }
nav a:hover { color: #3498db; }
</style>
</head>
<body>
<nav>
<h3>Sommaire</h3>
<ul>
<li><strong>Contrôleurs</strong>
<ul>
<li><a href="#FrmAuthController">FrmAuthController</a></li>
<li><a href="#FrmMediatekController">FrmMediatekController</a></li>
</ul>
</li>
<li><strong>Data Access</strong>
<ul>
<li><a href="#Access">Access (DAL)</a></li>
<li><a href="#ApiRest">ApiRest (Manager)</a></li>
</ul>
</li>
<li><strong>Modèles</strong>
<ul>
<li><a href="#Livre">Livre</a></li>
<li><a href="#Dvd">Dvd</a></li>
<li><a href="#Revue">Revue</a></li>
<li><a href="#Abonnement">Abonnement</a></li>
<li><a href="#CommandeDocument">CommandeDocument</a></li>
</ul>
</li>
</ul>
</nav>
<main>
<h1>Documentation Technique MediaTekDocuments</h1>
<p>Cette documentation détaille les classes, méthodes et structures de données de l'application de gestion MediaTekDocuments.</p>
<section id="controllers">
<h2>Espace de noms : MediaTekDocuments.controller</h2>
<h3 id="FrmAuthController">Classe FrmAuthController</h3>
<p class="summary">Contrôleur gérant l'authentification des utilisateurs.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr>
<td><code>GetConnection(login, pwd)</code></td>
<td>Vérifie les identifiants. Retourne un objet <code>Utilisateur</code> ou <code>null</code>.</td>
</tr>
</table>
<h3 id="FrmMediatekController">Classe FrmMediatekController</h3>
<p class="summary">Contrôleur principal servant d'interface entre la vue et la couche d'accès aux données.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr><td><code>GetAllLivres() / GetAllDvd() / GetAllRevues()</code></td><td>Récupère l'intégralité des documents par type.</td></tr>
<tr><td><code>GetExemplairesRevue(idDocument)</code></td><td>Récupère la liste des exemplaires pour une revue donnée.</td></tr>
<tr><td><code>GetCommandesDocument(idDocument)</code></td><td>Récupère les commandes (Livres/DVD) associées à un document.</td></tr>
<tr><td><code>UpdateSuiviCommande(idCommande, idSuivi)</code></td><td>Met à jour l'état d'avancement d'une commande.</td></tr>
<tr><td><code>CreerAbonnement(abonnement)</code></td><td>Enregistre un nouvel abonnement en base de données.</td></tr>
</table>
</section>
<section id="dal">
<h2>Espace de noms : MediaTekDocuments.dal & manager</h2>
<h3 id="Access">Classe Access</h3>
<p class="summary">Implémentation du pattern Singleton pour l'accès centralisé aux données via l'API.</p>
<table>
<tr><th>Membre</th><th>Description</th></tr>
<tr><td><code>GetInstance()</code></td><td>Retourne l'instance unique de la classe Access.</td></tr>
<tr><td><code>convertToJson(nom, valeur)</code></td><td>Sérialise un couple clé/valeur pour les envois à l'API.</td></tr>
<tr><td><code>GetNextCommandeId()</code></td><td>Récupère le futur identifiant de commande disponible.</td></tr>
</table>
<h3 id="ApiRest">Classe ApiRest</h3>
<p class="summary">Gère les appels HTTP bas niveau vers l'API Rest.</p>
<ul>
<li><strong>RecupDistant(methode, message, parametres) :</strong> Point d'entrée unique pour GET, POST, PUT, DELETE.</li>
</ul>
</section>
<section id="models">
<h2>Espace de noms : MediaTekDocuments.model</h2>
<p>Les classes modèles représentent les entités métier du domaine.</p>
<h3 id="Livre">Classe Livre (hérite de LivreDvd)</h3>
<table>
<tr><th>Propriété</th><th>Type</th><th>Description</th></tr>
<tr><td><code>Isbn</code></td><td>string</td><td>Code ISBN unique du livre.</td></tr>
<tr><td><code>Auteur</code></td><td>string</td><td>Nom de l'auteur.</td></tr>
<tr><td><code>Collection</code></td><td>string</td><td>Collection éditoriale.</td></tr>
</table>
<h3 id="Dvd">Classe Dvd (hérite de LivreDvd)</h3>
<table>
<tr><th>Propriété</th><th>Type</th><th>Description</th></tr>
<tr><td><code>Duree</code></td><td>int</td><td>Durée en minutes.</td></tr>
<tr><td><code>Realisateur</code></td><td>string</td><td>Nom du réalisateur.</td></tr>
<tr><td><code>Synopsis</code></td><td>string</td><td>Résumé du film.</td></tr>
</table>
<h3 id="Abonnement">Classe Abonnement</h3>
<p class="summary">Gère les informations liées aux contrats de revues.</p>
<ul>
<li><code>DateFinAbonnement</code> : Détermine la période de validité du contrat.</li>
<li><code>Montant</code> : Coût de l'abonnement.</li>
</ul>
<h3 id="CommandeDocument">Classe CommandeDocument</h3>
<p class="summary">Représente l'achat d'un exemplaire de livre ou de DVD.</p>
<ul>
<li><code>NbExemplaire</code> : Quantité commandée.</li>
<li><code>IdSuivi / LibelleSuivi</code> : État actuel (en cours, reçu, etc.).</li>
</ul>
</section>
<section id="views">
<h2>Espace de noms : MediaTekDocuments.view</h2>
<h3 id="FrmMediatek">Classe FrmMediatek</h3>
<p class="summary">Interface principale de l'application. Elle contient la logique de filtrage et d'affichage.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr><td><code>AlerteAbonnementsExpirants()</code></td><td>Vérifie au démarrage les abonnements finissant sous 30 jours.</td></tr>
<tr><td><code>PeutSupprimerAbonnement()</code></td><td>Contrôle métier : interdit la suppression si des exemplaires ont été reçus.</td></tr>
<tr><td><code>RemplirComboCategorie()</code></td><td>Méthode générique pour peupler les listes déroulantes (Genre, Public, Rayon).</td></tr>
</table>
</section>
<hr>
<footer>
<p>Généré le : 30 mars 2026 - Documentation technique MediaTekDocuments</p>
</footer>
</main>
</body>
</html>