commit
954a5beaf4
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 91 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 68 KiB |
@ -1,168 +1,93 @@
|
||||
# prepaLoL
|
||||
|
||||
## Diagramme de classes du modèle
|
||||
```mermaid
|
||||
classDiagram
|
||||
class LargeImage{
|
||||
+/Base64 : string
|
||||
}
|
||||
class Champion{
|
||||
+/Name : string
|
||||
+/Bio : string
|
||||
+/Icon : string
|
||||
+/Characteristics : Dictionary~string, int~
|
||||
~ AddSkin(skin : Skin) bool
|
||||
~ RemoveSkin(skin: Skin) bool
|
||||
+ AddSkill(skill: Skill) bool
|
||||
+ RemoveSkill(skill: Skill) bool
|
||||
+ AddCharacteristics(someCharacteristics : params Tuple~string, int~[])
|
||||
+ RemoveCharacteristics(label : string) bool
|
||||
+ this~label : string~ : int?
|
||||
}
|
||||
Champion --> "1" LargeImage : Image
|
||||
class ChampionClass{
|
||||
<<enumeration>>
|
||||
Unknown,
|
||||
Assassin,
|
||||
Fighter,
|
||||
Mage,
|
||||
Marksman,
|
||||
Support,
|
||||
Tank,
|
||||
}
|
||||
Champion --> "1" ChampionClass : Class
|
||||
class Skin{
|
||||
+/Name : string
|
||||
+/Description : string
|
||||
+/Icon : string
|
||||
+/Price : float
|
||||
}
|
||||
Skin --> "1" LargeImage : Image
|
||||
Champion "1" -- "*" Skin
|
||||
class Skill{
|
||||
+/Name : string
|
||||
+/Description : string
|
||||
}
|
||||
class SkillType{
|
||||
<<enumeration>>
|
||||
Unknown,
|
||||
Basic,
|
||||
Passive,
|
||||
Ultimate,
|
||||
}
|
||||
Skill --> "1" SkillType : Type
|
||||
Champion --> "*" Skill
|
||||
class Rune{
|
||||
+/Name : string
|
||||
+/Description : string
|
||||
}
|
||||
Rune --> "1" LargeImage : Image
|
||||
class RuneFamily{
|
||||
<<enumeration>>
|
||||
Unknown,
|
||||
Precision,
|
||||
Domination
|
||||
}
|
||||
Rune --> "1" RuneFamily : Family
|
||||
class Category{
|
||||
<<enumeration>>
|
||||
Major,
|
||||
Minor1,
|
||||
Minor2,
|
||||
Minor3,
|
||||
OtherMinor1,
|
||||
OtherMinor2
|
||||
}
|
||||
class RunePage{
|
||||
+/Name : string
|
||||
+/this[category : Category] : Rune?
|
||||
- CheckRunes(newRuneCategory : Category)
|
||||
- CheckFamilies(cat1 : Category, cat2 : Category) bool?
|
||||
- UpdateMajorFamily(minor : Category, expectedValue : bool)
|
||||
}
|
||||
RunePage --> "*" Rune : Dictionary~Category,Rune~
|
||||
```
|
||||
|
||||
## Diagramme de classes des interfaces de gestion de l'accès aux données
|
||||
```mermaid
|
||||
classDiagram
|
||||
direction LR;
|
||||
class IGenericDataManager~T~{
|
||||
<<interface>>
|
||||
GetNbItems() Task~int~
|
||||
GetItems(index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~T~~
|
||||
GetNbItemsByName(substring : string)
|
||||
GetItemsByName(substring : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~T~~
|
||||
UpdateItem(oldItem : T, newItem : T) Task~T~~
|
||||
AddItem(item : T) Task~T~
|
||||
DeleteItem(item : T) Task~bool~
|
||||
}
|
||||
class IChampionsManager{
|
||||
<<interface>>
|
||||
GetNbItemsByCharacteristic(charName : string)
|
||||
GetItemsByCharacteristic(charName : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
GetNbItemsByClass(championClass : ChampionClass)
|
||||
GetItemsByClass(championClass : ChampionClass, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
GetNbItemsBySkill(skill : Skill?)
|
||||
GetItemsBySkill(skill : Skill?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
GetNbItemsBySkill(skill : string)
|
||||
GetItemsBySkill(skill : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
GetNbItemsByRunePage(runePage : RunePage?)
|
||||
GetItemsByRunePage(runePage : RunePage?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
}
|
||||
class ISkinsManager{
|
||||
<<interface>>
|
||||
GetNbItemsByChampion(champion : Champion?)
|
||||
GetItemsByChampion(champion : Champion?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Skin?~~
|
||||
}
|
||||
class IRunesManager{
|
||||
<<interface>>
|
||||
GetNbItemsByFamily(family : RuneFamily)
|
||||
GetItemsByFamily(family : RuneFamily, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Rune?~~
|
||||
}
|
||||
class IRunePagesManager{
|
||||
<<interface>>
|
||||
GetNbItemsByRune(rune : Rune?)
|
||||
GetItemsByRune(rune : Rune?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~RunePage?~~
|
||||
GetNbItemsByChampion(champion : Champion?)
|
||||
GetItemsByChampion(champion : Champion?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~RunePage?~~
|
||||
}
|
||||
|
||||
IGenericDataManager~Champion?~ <|.. IChampionsManager : T--Champion?
|
||||
IGenericDataManager~Skin?~ <|.. ISkinsManager : T--Skin?
|
||||
IGenericDataManager~Rune?~ <|.. IRunesManager : T--Rune?
|
||||
IGenericDataManager~RunePage?~ <|.. IRunePagesManager : T--RunePage?
|
||||
class IDataManager{
|
||||
<<interface>>
|
||||
}
|
||||
IChampionsManager <-- IDataManager : ChampionsMgr
|
||||
ISkinsManager <-- IDataManager : SkinsMgr
|
||||
IRunesManager <-- IDataManager : RunesMgr
|
||||
IRunePagesManager <-- IDataManager : RunePagesMgr
|
||||
```
|
||||
|
||||
## Diagramme de classes simplifié du Stub
|
||||
```mermaid
|
||||
classDiagram
|
||||
direction TB;
|
||||
|
||||
IDataManager <|.. StubData
|
||||
|
||||
ChampionsManager ..|> IChampionsManager
|
||||
StubData --> ChampionsManager
|
||||
|
||||
RunesManager ..|> IRunesManager
|
||||
StubData --> RunesManager
|
||||
|
||||
RunePagesManager ..|> IRunePagesManager
|
||||
StubData --> RunePagesManager
|
||||
|
||||
SkinsManager ..|> ISkinsManager
|
||||
StubData --> SkinsManager
|
||||
|
||||
StubData --> RunesManager
|
||||
StubData --> "*" Champion
|
||||
StubData --> "*" Rune
|
||||
StubData --> "*" RunePages
|
||||
StubData --> "*" Skins
|
||||
```
|
||||
|
||||
## LOLProject
|
||||
|
||||
|
||||
|
||||
|
||||
**LOLProject** est un projet reliant une API C# et EntityFramework afin de produire une API qui renvoie les informations d'une base de données SQLite sur un client MAUI
|
||||
|
||||
Merci de noter la v1 de l'api qui est tenu a jour la v2 sert uniquement a montrer que nous pouvons versionner.
|
||||
|
||||
## :floppy_disk: FEATURES
|
||||
|
||||
- L'API dispose des principales requêtes CRUD sur les champions, skills, skins, runes, runepages aussi consultables sur le swagger UI.
|
||||
- L'ORM réalisé avec EntityFramework afin d'enregistrer dans une base de données SQLite
|
||||
- L'application MAUI pour faire des requêtes depuis un client et les afficher.
|
||||
|
||||
|
||||

|
||||
|
||||
## :dizzy: Getting Started
|
||||
|
||||
Une fois le dépot cloné, vous pouvez lancer le code sur votre téléphone Android grâce à l'outil Android Studio ou grâce à un émulateur Android.
|
||||
|
||||
|
||||
## Archutecture
|
||||
|
||||

|
||||
Ce schéma d'architecure globale permet de comprendre la composition interne de la solution.
|
||||
|
||||
Sur la partie gauche on peut voir la partie client qui fait appel a l'api via des requetes http en utilisant les routes de l'api Rest Full.
|
||||
Pour tout a fait comprendre, comment communiquent et fonctionnent les différentes briques de la solution nous allons vous détailler brique par brique, relation par relation les différentes point rouge du schéma.
|
||||
|
||||
## 1 - La déserialization
|
||||
Le client est une solution qui va intérragir avec notre api grace des requetes sur internet. Il nécessite donc impérativement d'une connexion internet afin de pouvoir communiquer grace a des requetes http(s). Une fois qu'il a récupéré les données demandé. Il doit transoformer ce document json en classe métier de son model. Cela s'appel la déserialization. Ce processus ce traduit ar le code suivant en C#.
|
||||
|
||||

|
||||
|
||||
|
||||
## 2 - La communication Client - Api
|
||||
Maintenant que vous savez comment le client traite les données renvoyées par l'API, nous allons a présent voir comment ils communiquent entre eux. Cette communication se fait par des requetes http(s) sous la forme suivante.
|
||||
|
||||
"codefirst.iut.uca.fr/containers/lucasdelanier-containerlol/api/v{version}/{controller}"
|
||||
|
||||
Lors de l'appel de l'API, le client peut choisir la version ( v1, v2, etc) mais aussi indiquer le controlleur qu'il souhaite intérroger. Par exemple Champion lui permettra de récuperer des informations sur les champions que connait l'API. Il est aussi possible de rajouter de précisions en ajoutant par exemple un nom apres le controller pour demander les informations spécifique a un champion en particulié. Lors des communications, les objects sons traduit sous la forme DTO. Cela permet de controller l'envoie de certaines données au client comme pr exemple un id unique ou des données sensibles qui ne doivent pas etre connu par l'utilisateur. Voici un exemple.
|
||||
|
||||

|
||||
|
||||
Ci dessus on voit que l'object champion a une nouvelle "forme" ChampionDTO que l'on construit a partir des attributs d'un champion. Dans l'exemple, il reprend les memes informations qu'un champion mais on aurait put imaginer qu'il en perde certains que l'on ne veut pas renvoyer a l'utilisateur. Pour permettre le passage d'un DTO en object et d'un object en DTO il faut ce qu'on appel des Mappers. Voici l'exemple des méthodes ToModel() et ToDTO()
|
||||
|
||||

|
||||
|
||||
## 3 - L'utilisation du stub dans l'API
|
||||
Avant de faire la relation avec une base de données. Il était impotant de pouvoir tester l'application avec un Stub qui est une classe contenant des listes d'object. Une sorte de base de données fictive. Pour permettre a l'api d'intéroger ce stub, il a fallut faire un manager spécialement destiné à l'utilisation du stub (StubData) qui hérite d'un manager commun qui est une interface composé des méthodes nécessaire a l'interrogation des données (IDataManager).
|
||||
|
||||

|
||||
|
||||
|
||||
## 4 - Lien entre API et Entityframework
|
||||
...
|
||||
|
||||
|
||||
## 5 - Mappage des classes métier en tables
|
||||
...
|
||||
|
||||
## 6 - Lien avec base de données SQLlite
|
||||
...
|
||||
|
||||
|
||||
## :wrench: SUPPORT
|
||||
En cas de problème lors de l'utilisation de l'application, vous pouvez nous contacter aux adresses suivantes :
|
||||
|
||||
|
||||
Lucas Delanier : **Lucas.DELANIER@etu.uca.fr** </br>
|
||||
Louison Parant : **Louison.PARANT@etu.uca.fr**
|
||||

|
||||
|
||||
|
||||
|
||||
## ✨ Contributors
|
||||
|
||||
<a href = "https://codefirst.iut.uca.fr/git/lucas.delanier">
|
||||
<img src ="https://codefirst.iut.uca.fr/git/avatars/6a3835d734392fccff3949f7c82a63b9?size=870" height="50px">
|
||||
</a>
|
||||
<a href = "https://codefirst.iut.uca.fr/git/louison.parant">
|
||||
<img src ="https://codefirst.iut.uca.fr/git/avatars/b337a607f680a2d9af25eb09ea457be9?size=870" height="50px">
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in new issue