You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
Go to file
Pierre Ferreira d38600ce4b
test maui
2 years ago
EF_LoL 🧪 ajout du premier test et des charactéristiques(pb sur cette dernière nonobstant..) 🩹 2 years ago
Sources test maui 2 years ago
docAsset Ajout d'un client utilisant http 2 years ago
.drone.yml fix merge conflit 💚 2 years ago
.gitignore changement gitignore 2 years ago
README.md Ajout d'un client utilisant http 2 years ago

README.md

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.

C# JWT Markdown

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 :

👽 Consomation et Développement de services 👷

🚂 Comment lancer le projet ?

(Explication...) 🚧

🏁 État des livrables :

🚧

  • ✔️ Mise en place de toutes les opérations CRUD
  • ✔️ API RESTful (respect des règles de routage, utilisation des bons status code ...)
  • Utilisation des fichiers configurations
  • ✔️ Versionnage de l'api (avec versionnage de la doc)
  • ✔️ Logs
  • ✔️ Tests unitaires
  • Réalisation du client MAUI et liaison avec l'api
  • ✔️Liaison avec la base de données
  • ✔️Filtrage + Pagination des données
  • 🚧 Propreté du code (Vous pouvez vous servir de sonarqube)
  • ✔️ Dockerisation et Hébergement des API (CodeFirst)
  • Sécurité
  • ✔️ Utilisation SonarQube

Build Status


📦 Entity FrameWork 👷

🚧

🏁 État des livrables :

Partie 1 :

  • Exo1 : 🚧 une base de données une table de champion utilisation du client console/mobile requetes CRUD (+ tri, filtrage)

  • Exo2 : ✔️ UT Base de données stubbée SQLiteInMemory

  • Exo3 : ✔️ Déploiement EF et tests via code#0


Partie 2 :

  • Exo4 : ✔️ implémentation des runes et skins (1 table -> pas de relation)

  • Exo5 : ✔️ Relation entre champion et skin (OneToMany)

  • Exo6 : ✔️ 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 : ✔️ mapping entre model et entité (intégration de qualité) (en 1 table et avec relations)

  • Exo8 : 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<IDataManager,HTTPDataManager>();

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<IDataManager,EFDataManager>();

Explication de ce qu'on a fait et ce qu'on a pas fait et pourquoi on a priorisé ca plutot que d'autre :

🚧

Coordonnées :

Corentin Richard : corentin.richard@etu.uca.fr

Pierre Ferreira : pierre.ferreira@etu.uca.fr


Sujet principal :


prepaLoL

Diagramme de classes du modèle

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

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

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