8hHG&W`V?q#)A{mQDgxWxXSFBY|#rNx!i
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
en3cfUzOyQDw(qQpgcFkRDrt)36n7NDN%&u*r
Date: Sat, 25 Mar 2023 23:05:59 +0100
Subject: [PATCH 2/4] ajout d'un RuneController (et donc de RuneMapper et
RuneDTO) :package:
---
.../API_LoL/Controllers/RunesController.cs | 186 ++++++++++++++++++
Sources/API_LoL/Mapper/RuneMapper.cs | 19 ++
Sources/DTO/DTO.csproj | 1 +
Sources/DTO/RuneDTO.cs | 43 ++++
4 files changed, 249 insertions(+)
create mode 100644 Sources/API_LoL/Controllers/RunesController.cs
create mode 100644 Sources/API_LoL/Mapper/RuneMapper.cs
create mode 100644 Sources/DTO/RuneDTO.cs
diff --git a/Sources/API_LoL/Controllers/RunesController.cs b/Sources/API_LoL/Controllers/RunesController.cs
new file mode 100644
index 0000000..899c445
--- /dev/null
+++ b/Sources/API_LoL/Controllers/RunesController.cs
@@ -0,0 +1,186 @@
+using API_LoL.Mapper;
+using DTO;
+using EntityFramework;
+using Microsoft.AspNetCore.Mvc;
+using Model;
+
+namespace API_LoL.Controllers
+{
+ [Route("api/v{version:apiVersion}/[controller]")]
+ [ApiController]
+ public class RunesController : ControllerBase
+ {
+
+
+ public RunesController(IDataManager Manager)
+ {
+ this.RunesManager = Manager.RunesMgr;
+ }
+
+ private IRunesManager RunesManager;
+
+ // GET api//5
+
+ [HttpGet("count")]
+ public async Task GetCount()
+ {
+ return Ok(RunesManager.GetNbItems());
+ }
+
+ [HttpGet]
+ public async Task Get(string? name = null, string desc = null, EnumRuneFamily Family = EnumRuneFamily.Unknown, LargeImage Image = null, int index = 0, int size = 10)
+ {
+ if (size - index > 10)
+ {
+ return BadRequest();
+ }
+ if (!string.IsNullOrEmpty(name))
+ {
+ var list = await RunesManager.GetItemsByName(name, index, size);
+ if (list.Count() != 0)
+ {
+ return Ok(list.Select(rune => rune?.ToDTO()));
+ }
+ else { return NoContent(); }
+ }
+ ///else if peu important : on ne cherche pas des runes par famille ou description
+ //else if (!string.IsNullOrEmpty(desc))
+ //{
+ // var list = await RunesManager.GetItemsBySkill(desc, index, size);
+ // if (list.Count() != 0)
+ // {
+ // return Ok(list.Select(champion => champion?.ToDTO()));
+ // }
+ // else { return NoContent(); }
+ //}
+ //else if (!string.IsNullOrEmpty(Family))
+ //{
+ // var list = await RunesManager.GetItems(index, size);
+ // if (list.Count() != 0)
+ // {
+ // return Ok(list.Select(champion => champion?.ToDTO()));
+ // }
+ // else { return NoContent(); }
+ //}
+ //else if (!string.IsNullOrEmpty(Image))
+ //{
+ // var list = await RunesManager.GetItems(index, size);
+ // if (list.Count() != 0)
+ // {
+ // return Ok(list.Select(champion => champion?.ToDTO()));
+ // }
+ // else { return NoContent(); }
+ //}
+ else
+ {
+ var list = await RunesManager.GetItems(index, size);
+ if (list.Count() != 0)
+ {
+ return Ok(list.Select(champion => champion?.ToDTO()));
+ }
+ else { return NoContent(); }
+ }
+ }
+
+ [HttpGet("name")]
+ public async Task GetByName(String name)
+ {
+ if (string.IsNullOrEmpty(name)) return BadRequest();
+ var list = await RunesManager.GetItemsByName(name, 0, 1);
+ if (list.Count() == 1)
+ {
+ return Ok(list.Select(rune => rune?.ToDTO()).First());
+ }
+ else { return NoContent(); }
+
+ }
+
+ //[HttpGet("name/skins")]
+ //public async Task GetSkinsByName(String name)
+ //{
+ // if (string.IsNullOrEmpty(name)) return BadRequest();
+ // var list = await RunesManager.GetItemsByName(name, 0, 1);
+ // if (list.Count() == 1)
+ // {
+ // var nb = await SkinsManager.GetNbItemsByChampion(list.First());
+ // if (nb != 0)
+ // {
+ // var skins = await SkinsManager.GetItemsByChampion(list.First(), 0, nb);
+ // return Ok(skins.Select(skin => skin?.ToDTO()));
+ // }
+ // else { return NoContent(); }
+ // }
+ // else { return NoContent(); }
+ //}
+
+ //[HttpGet("name/skills")]
+ //public async Task GetSkillsByName(String name)
+ //{
+ // if (string.IsNullOrEmpty(name)) return BadRequest();
+ // var list = await RunesManager.GetItemsByName(name, 0, 1);
+ // if (list.Count() == 1)
+ // {
+ // var skins = await SkinsManager.GetItemsByChampion(list.First(), 0, await SkinsManager.GetNbItemsByChampion(list.First()));
+ // if (skins.Count() != 0)
+ // {
+ // return Ok(skins.Select(skin => skin?.ToDTO()));
+ // }
+ // else { return NoContent(); }
+ // }
+ // else { return NoContent(); }
+ //}
+
+
+
+ // POST api/
+ [HttpPost]
+ public async Task Post(RuneDTO rune)
+ {
+ if (rune == null)
+ {
+ return UnprocessableEntity();
+ }
+ else
+ {
+ var champ = await RunesManager.GetItemsByName(rune.Name, 0, 1);
+ if (champ.Count() != 0 && champ.FirstOrDefault().Name == rune.Name)
+ {
+ return Conflict(rune);
+ }
+ await RunesManager.AddItem(rune.ToRune());
+ return CreatedAtAction("Post", rune);
+
+ }
+ }
+
+ // PUT api//5
+ [HttpPut("name")]
+ public async Task Put(string name, RuneDTO rune)
+ {
+ if (string.IsNullOrEmpty(name))
+ return BadRequest();
+ if (rune == null)
+ return UnprocessableEntity();
+ var list = await RunesManager.GetItemsByName(name, 0, 1);
+ if (list.Count() == 1)
+ {
+ return Ok(RunesManager.UpdateItem(list.First(), rune.ToRune()));
+ }
+ else { return NoContent(); }
+ }
+
+ // DELETE api//5
+ [HttpDelete("name")]
+ public async Task Delete(string name)
+ {
+ if (string.IsNullOrEmpty(name))
+ return BadRequest();
+ var list = await RunesManager.GetItemsByName(name, 0, 1);
+ if (list.Count() == 1)
+ {
+ return Ok(await RunesManager.DeleteItem(list.First()));
+ }
+ else { return NoContent(); }
+ }
+ }
+}
diff --git a/Sources/API_LoL/Mapper/RuneMapper.cs b/Sources/API_LoL/Mapper/RuneMapper.cs
new file mode 100644
index 0000000..92aa560
--- /dev/null
+++ b/Sources/API_LoL/Mapper/RuneMapper.cs
@@ -0,0 +1,19 @@
+using DTO;
+using Model;
+
+namespace API_LoL.Mapper
+{
+ public static class RuneMapper
+ {
+ public static RuneDTO ToDTO(this Rune rune)
+ {
+ return new RuneDTO(rune.Name, rune.Description, rune.Family, rune.Image, rune.Icon);
+ }
+
+ public static Rune ToRune(this RuneDTO rune)
+ {
+ return new Rune(rune.Name, rune.Family, rune.Icon, rune.Image.Base64, rune.Description);
+
+ }
+ }
+}
diff --git a/Sources/DTO/DTO.csproj b/Sources/DTO/DTO.csproj
index dd77eab..4e05eb4 100644
--- a/Sources/DTO/DTO.csproj
+++ b/Sources/DTO/DTO.csproj
@@ -7,6 +7,7 @@
+
diff --git a/Sources/DTO/RuneDTO.cs b/Sources/DTO/RuneDTO.cs
new file mode 100644
index 0000000..4cdb42c
--- /dev/null
+++ b/Sources/DTO/RuneDTO.cs
@@ -0,0 +1,43 @@
+using EntityFramework;
+using Model;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DTO
+{
+ public class RuneDTO
+ {
+ public RuneDTO(string name, string desc, RuneFamily family, LargeImage image, string icon)
+ {
+ Name = name;
+ Description = desc;
+ Family = family;
+ Image = image;
+ Icon = icon;
+ }
+
+ public string Name { get; set; }
+ public string Description { get; set; }
+ public RuneFamily Family { get; set; }
+ public string Icon { get; set; }
+
+ public LargeImage Image { get; set; }
+
+ public bool equals(RuneDTO other)
+ {
+ return other.Name == Name
+ && other.Description == Description
+ && other.Family == Family
+ && other.Image == Image
+ && other.Icon == Icon;
+ }
+
+ public string toString()
+ {
+ return Name + Description + Family.ToString();
+ }
+ }
+}
From b94825d358dd4241ff9f785bbcd9eadc504ca2b3 Mon Sep 17 00:00:00 2001
From: Corentin R <76619184+Koroh63@users.noreply.github.com>
Date: Sun, 26 Mar 2023 18:11:26 +0200
Subject: [PATCH 3/4] Ajout d'un client utilisant http
---
README.md | 118 ++++++++++++++++++++++++++
docAsset/Diagramme d'architecture.jpg | Bin 0 -> 3237268 bytes
2 files changed, 118 insertions(+)
create mode 100644 docAsset/Diagramme d'architecture.jpg
diff --git a/README.md b/README.md
index 3228583..9698acb 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,121 @@
+
+# Projet d'Entity FrameWork et Consomation et Développement de services
+
+Notre projet à pour objectif la liaison entre une base de donnée et un client, par l'utilisation d' ``EntityFramework`` et d'une ``API`` C# créé par nous même.
+
+
+
+
+
+> *A noter que seul la v1 est prise en compte, la v2 et v2.2 ne sont presentes uniquement pour prouver notre capacité à versionner*
+
+Ce projet est decoupé en deux parties :
+
+## :alien: Consomation et Développement de services :construction_worker:
+
+
+#### :steam_locomotive: Comment lancer le projet ?
+
+> (Explication...) :construction:
+
+
+#### :checkered_flag: État des livrables :
+
+:construction:
+> * :heavy_check_mark: Mise en place de toutes les opérations CRUD
+> * :heavy_check_mark: API RESTful (respect des règles de routage, utilisation des bons status code ...)
+> * :heavy_exclamation_mark: Utilisation des fichiers configurations
+> * :heavy_check_mark: Versionnage de l'api (avec versionnage de la doc)
+> * :heavy_check_mark: Logs
+> * :heavy_check_mark: Tests unitaires
+> * :heavy_exclamation_mark: Réalisation du client MAUI et liaison avec l'api
+> * :heavy_check_mark:Liaison avec la base de données
+> * :heavy_check_mark:Filtrage + Pagination des données
+> * :construction: Propreté du code (Vous pouvez vous servir de sonarqube)
+> * :heavy_check_mark: Dockerisation et Hébergement des API (CodeFirst)
+
+> * :heavy_exclamation_mark: Sécurité
+> * :heavy_check_mark: Utilisation SonarQube
+
+[](https://codefirst.iut.uca.fr/corentin.richard/EntityFramework_ConsoDeServices_TP)
+
+
+
+---
+## :package: Entity FrameWork :construction_worker:
+:construction:
+
+#### :checkered_flag: État des livrables :
+
+Partie 1 :
+* Exo1 : :construction:
+ une base de données
+ une table de champion
+ utilisation du client console/mobile
+ requetes CRUD (+ tri, filtrage)
+
+* Exo2 : :heavy_check_mark:
+ UT
+ Base de données stubbée
+ SQLiteInMemory
+
+* Exo3 : :heavy_check_mark:
+ Déploiement EF et tests via code#0
+
+---
+
+Partie 2 :
+* Exo4 : :heavy_check_mark:
+ implémentation des runes et skins (1 table -> pas de relation)
+
+* Exo5 : :heavy_check_mark:
+ Relation entre champion et skin (OneToMany)
+
+* Exo6 : :heavy_check_mark:
+ Relation entre Champion, RunePage et Rune (ManyToMany)
+> La relation entre Rune et RunePage à été simplifiée par manque de temps, il ne s'agit donc pas d'un dictionaire mais d'un OneToMany.
+
+* Exo7 : :heavy_check_mark:
+ mapping entre model et entité (intégration de qualité)
+ (en 1 table et avec relations)
+
+* Exo8 : :heavy_exclamation_mark:
+ Ajouter le paterne UnitOfWork (rollback en cas de probleme sur les transaction)
+
+---
+#### Diagramme d'architechture :
+
+
+Le schéma ci-dessus décris l'architecture finale que doit avoir le projet,
+
+Tout en haut, la partie client est composé du client MAUI et et du client Console, ceux-ci permettent l'affichage des ressources, l'utilisation de l'architecture et donc de tester si tout le projet fonctionne. Celui-ci utilise le HTTPDataManager qui lui permet d'effectuer les requêtes à l'API afin de récupérer les données. Il hérite de IDataManager et peux donc être remplacé par EFDataManager, court-circuitant ainsi l'API ou par StubLib, n'utilisant pas l'API et l'EF. Le DataManager utilise l'une des extensions mapper pour convertir les objets DTO en Model.
+> On indique aux client d'utiliser le HttpDataManager :
+
+ builder.Services.AddScoped();
+
+En second, la partie API, celle-ci s'occupe de recevoir les requêtes et de renvoyer les objet en conséquent. Dans l'implémentation idéale, l'API utilise l'EFDataManger pour faire appel aux données stockés en base de données. Il hérite lui aussi de IDataManager mais ne peut être remplacé que par le StubLib.Il utilise lui aussi des extensions mapper pour convertir les objets Entity en Model.
+> On indique à l'API d'utiliser le EFDataManager :
+
+ builder.Services.AddScoped();
+
+## Explication de ce qu'on a fait et ce qu'on a pas fait et pourquoi on a priorisé ca plutot que d'autre :
+
+
+
+
+:construction:
+
+## Coordonnées :
+
+``Corentin Richard`` : **[corentin.richard@etu.uca.fr](https://codefirst.iut.uca.fr/git/corentin.richard)**
+
+``Pierre Ferreira`` : **[pierre.ferreira@etu.uca.fr](https://codefirst.iut.uca.fr/git/pierre.ferreira)**
+
+
+---
+# Sujet principal :
+
+---
# prepaLoL
## Diagramme de classes du modèle
diff --git a/docAsset/Diagramme d'architecture.jpg b/docAsset/Diagramme d'architecture.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..de07a548353f9867b54e2236c63bc8442763d600
GIT binary patch
literal 3237268
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