Compare commits

...

53 Commits
rune ... master

Author SHA1 Message Date
Lucas DELANIER d61badd2c1 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 43e79ad879 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 30006c2a05 merge EF master
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 9d5bb44db7 merge EF
2 years ago
Louison PARANT 954a5beaf4 merge
2 years ago
Lucas Delanier 320af91c4d Merge branch 'master' of https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier ec30c62a53 ut
2 years ago
Lucas DELANIER 6ad3d04bfc Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER 85f983101b Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER 2375d451ac Transférer les fichiers vers 'Documentations'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER 977038d6e1 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER c3bf8ae799 Transférer les fichiers vers 'Documentations'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER 759fb1d702 Transférer les fichiers vers 'Documentations'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER 466e5d1742 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER 86db87a6b4 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER 9c510c1169 Transférer les fichiers vers 'Documentations'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER d3a6115aab Transférer les fichiers vers 'Documentations'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier 9d9d1633e9 Merge branch 'master' of https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier 740c953f3d update v2
2 years ago
Lucas DELANIER 9e060e989c Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT b343313730 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT d6e1228511 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT d10e81e08b Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 5b561762aa Supprimer 'Documentations/Group 13.png'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT ccb1ebea3f Transférer les fichiers vers 'Documentations'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT b0200bf1a9 Supprimer 'Mask group.png'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 5a3155e5a9 Transférer les fichiers vers ''
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER ed176bd5d7 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 931860ad0e Push EFManager
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas DELANIER 429aacf744 Mise à jour de 'README.md'
2 years ago
Lucas DELANIER a6915bff52 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier 65a211fd85 test ci
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier f0e9f43284 Merge branch 'master' of https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier 55447bf403 push
2 years ago
Louison PARANT 360c84ed35 Finished DB
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT bce3933e33 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 8ddb7d39a8 Mise à jour de 'README.md'
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier c14dd95142 push merge
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT e071376f80 Add Entities and EFManagers
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier 1dcd5db1fc Merge branch 'master' of https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier 78c79cfea1 merge master
2 years ago
Lucas DELANIER 42be77e907 Transférer les fichiers vers 'Documentations'
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas DELANIER 2dd3fd8088 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas DELANIER 61524f2bb0 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas DELANIER 920efc3bec Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 306d637b53 test ignored
continuous-integration/drone/push Build is passing Details
2 years ago
Louison PARANT 17718682ad Fusion EFManager
2 years ago
Lucas Delanier 66f7fd10b7 solve error pageresponse
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier fbbc8d036a modif
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 3fc3ddff6c Push Modif EF + Manager EF (manque modif Mapper à pull)
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier 652d47c40e finishh pagination
continuous-integration/drone/push Build is failing Details
2 years ago
Lucas Delanier 70fa29f29a add attribu to championdto
continuous-integration/drone/push Build is failing Details
2 years ago
Louison PARANT 096dc87b5f API Skill (Mapper+Controller)
continuous-integration/drone/push Build is failing Details
2 years ago

@ -26,25 +26,24 @@ steps:
- dotnet test LeagueOfLegends.sln --no-restore - dotnet test LeagueOfLegends.sln --no-restore
depends_on: [build] depends_on: [build]
#- name: code-analysis - name: code-analysis
#image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dronesonarplugin-dotnet6 image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dronesonarplugin-dotnet6
#commands: commands:
#- cd Sources/ - cd Sources/
#- dotnet restore LeagueOfLegends.sln - dotnet restore LeagueOfLegends.sln
#- dotnet sonarscanner begin /k:TEST /d:sonar.host.url=$${PLUGIN_SONAR_HOST} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Tests/**" /d:sonar.login=$${PLUGIN_SONAR_TOKEN} - dotnet sonarscanner begin /k:LOLProject /d:sonar.host.url=$${PLUGIN_SONAR_HOST} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Tests/**" /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
#- dotnet build LeagueOfLegends.sln -c Release --no-restore - dotnet build LeagueOfLegends.sln -c Release --no-restore
#- dotnet test LeagueOfLegends.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage" - dotnet test LeagueOfLegends.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
#- reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport" - reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport"
#- dotnet publish LeagueOfLegends.sln -c Release --no-restore -o CI_PROJECT_DIR/build/release - dotnet publish LeagueOfLegends.sln -c Release --no-restore -o CI_PROJECT_DIR/build/release
#- dotnet sonarscanner end /d:sonar.login=$${PLUGIN_SONAR_TOKEN} - dotnet sonarscanner end /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
#secrets: [ SECRET_SONAR_LOGIN ] secrets: [ SONAR_TOKEN ]
# settings: settings:
# accessible en ligne de commande par ${PLUGIN_SONAR_HOST} sonar_host: https://codefirst.iut.uca.fr/sonar/
#sonar_host: https://codefirst.iut.uca.fr/sonar/ sonar_token:
# accessible en ligne de commande par ${PLUGIN_SONAR_TOKEN} from_secret: SONAR_TOKEN
#sonar_token: depends_on: [tests]
#from_secret: SECRET_SONAR_LOGIN
#depends_on: [tests]
- name: generate-and-deploy-docs - name: generate-and-deploy-docs
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-docdeployer image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-docdeployer
@ -77,7 +76,7 @@ steps:
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest
environment: environment:
IMAGENAME: hub.codefirst.iut.uca.fr/lucas.delanier/lolproject:latest IMAGENAME: hub.codefirst.iut.uca.fr/lucas.delanier/lolproject:latest
CONTAINERNAME: container_lol CONTAINERNAME: containerlol
COMMAND: create COMMAND: create
OVERWRITE: true OVERWRITE: true
volumes: volumes:

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

@ -1,168 +1,97 @@
# prepaLoL
## LOLProject
## Diagramme de classes du modèle
```mermaid
classDiagram
class LargeImage{
+/Base64 : string **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
}
class Champion{ Merci de noter la v1 de l'api qui est tenu a jour la v2 sert uniquement a montrer que nous pouvons versionner.
+/Name : string
+/Bio : string ## :floppy_disk: FEATURES
+/Icon : string
+/Characteristics : Dictionary~string, int~ - L'API dispose des principales requêtes CRUD sur les champions, skills, skins, runes, runepages aussi consultables sur le swagger UI.
~ AddSkin(skin : Skin) bool - L'ORM réalisé avec EntityFramework afin d'enregistrer dans une base de données SQLite
~ RemoveSkin(skin: Skin) bool - L'application MAUI pour faire des requêtes depuis un client et les afficher.
+ AddSkill(skill: Skill) bool
+ RemoveSkill(skill: Skill) bool
+ AddCharacteristics(someCharacteristics : params Tuple~string, int~[]) ![](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png)
+ RemoveCharacteristics(label : string) bool
+ this~label : string~ : int? ## :dizzy: Getting Started
}
Champion --> "1" LargeImage : Image 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.
class ChampionClass{
<<enumeration>>
Unknown, ## Architecture
Assassin,
Fighter, ![](https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject/raw/branch/master/Documentations/Schema_architecture.png)
Mage, Ce schéma d'architecure globale permet de comprendre la composition interne de la solution.
Marksman,
Support, 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.
Tank, 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.
}
Champion --> "1" ChampionClass : Class ## 1 - La déserialization
class Skin{ 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#.
+/Name : string
+/Description : string ![](https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject/raw/branch/master/Documentations/Capture%20d%27%C3%A9cran%202023-03-26%20111526.png)
+/Icon : string
+/Price : float
} ## 2 - La communication Client - Api
Skin --> "1" LargeImage : Image 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.
Champion "1" -- "*" Skin
class Skill{ "codefirst.iut.uca.fr/containers/lucasdelanier-containerlol/api/v{version}/{controller}"
+/Name : string
+/Description : string 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.
}
class SkillType{ ![](https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject/raw/branch/master/Documentations/Capture%20d%27%C3%A9cran%202023-03-26%20113439.png)
<<enumeration>>
Unknown, 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()
Basic,
Passive, ![](https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject/raw/branch/master/Documentations/Capture%20d%27%C3%A9cran%202023-03-26%20113710.png)
Ultimate,
} ## 3 - L'utilisation du stub dans l'API
Skill --> "1" SkillType : Type 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).
Champion --> "*" Skill
class Rune{ ![](https://codefirst.iut.uca.fr/git/lucas.delanier/LOLProject/raw/branch/master/Documentations/Capture%20d%27%C3%A9cran%202023-03-26%20114811.png)
+/Name : string
+/Description : string
} ## 4 - Lien entre API et Entityframework
Rune --> "1" LargeImage : Image Pour relier l'API avec la partie EntityFramework, cela se passe du côté de l'API. En effet, en ayant implémenter des managers en EntityFramework, il suffit de les instancier côté API puis de demander la requête adéquate pour obtenir les données de la base de données avec l'API. Ces managers regroupent plusieurs petits managers gérant chacun une entité de la base de données (Champion, RunePage, Rune, ...). Il n'y a pas de managers de Skill car ceux-ci sont compris dans le manager Champion (un peu comme les mappers côté API).
class RuneFamily{
<<enumeration>>
Unknown, ## 5 - Mappage des classes métier en tables
Precision, Afin de rentrer les classes métiers en base de données, il faut avant tout les mapper. Ainsi, il y a un mapper pour chaque entité de la base de données (même pour Skill par exemple). Ensuite, il faut deux méthodes pour chaque mapper :
Domination <br> 1- ToEntity : elle prend en paramètre un objet du modèle et permet de le transformer en entité afin de pouvoir l'insérer en base de données.
} <br> 2- ToModel : elle prend en paramètre une entité et permet de la transformer en objet.
Rune --> "1" RuneFamily : Family Grâce à ces deux méthodes, nous pouvons facilement mapper des entités en objet et inversement.
class Category{
<<enumeration>>
Major, ## 6 - Lien avec base de données SQLite
Minor1, Il y a deux manières d'utiliser la base de données SQLite. On peut soit, utiliser la base de données interne à l'appareil ou bien utiliser la mémoire de l'appareil pour sauvegarder les données en local. Pour créer la base, il faut avoir des classes entités représentant chacune une table de la base. Il peut aussi y avoir des entités représentant des liaisons entre deux tables (RunePageRuneEntity par exemple représente la table entre RunePage et Rune). Ensuite, il faut un contexte (SQLiteContext pour notre projet) qui a pour attributs des DbSets, des listes d'entités à mettre en base de données. Pour remplir la base de données, avec un Stub par exemple, on peut utiliser la méthode onCreate du contexte pour insérer des entités créees manuellement. Cependant, pour mettre des objets en base, il faut donc les mapper en entité puis, passer par un manager (dans notre cas) pour enfin le rentrer en base.
Minor2,
Minor3,
OtherMinor1, ## :wrench: SUPPORT
OtherMinor2 En cas de problème lors de l'utilisation de l'application, vous pouvez nous contacter aux adresses suivantes :
}
class RunePage{
+/Name : string Lucas Delanier : **Lucas.DELANIER@etu.uca.fr** </br>
+/this[category : Category] : Rune? Louison Parant : **Louison.PARANT@etu.uca.fr**
- CheckRunes(newRuneCategory : Category) ![](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png)
- CheckFamilies(cat1 : Category, cat2 : Category) bool?
- UpdateMajorFamily(minor : Category, expectedValue : bool)
}
RunePage --> "*" Rune : Dictionary~Category,Rune~ ## ✨ Contributors
```
<a href = "https://codefirst.iut.uca.fr/git/lucas.delanier">
## Diagramme de classes des interfaces de gestion de l'accès aux données <img src ="https://codefirst.iut.uca.fr/git/avatars/6a3835d734392fccff3949f7c82a63b9?size=870" height="50px">
```mermaid </a>
classDiagram <a href = "https://codefirst.iut.uca.fr/git/louison.parant">
direction LR; <img src ="https://codefirst.iut.uca.fr/git/avatars/b337a607f680a2d9af25eb09ea457be9?size=870" height="50px">
class IGenericDataManager~T~{ </a>
<<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
```

@ -18,10 +18,14 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="Swashbuckle.Core" Version="5.6.0" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DTO\DTO.csproj" /> <ProjectReference Include="..\DTO\DTO.csproj" />
<ProjectReference Include="..\EntityFrameworkLOL\EntityFrameworkLOL.csproj" />
<ProjectReference Include="..\Model\Model.csproj" /> <ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\StubLib\StubLib.csproj" /> <ProjectReference Include="..\StubLib\StubLib.csproj" />
</ItemGroup> </ItemGroup>

@ -0,0 +1,71 @@
using APILOL.Mapper;
using DTO;
using Microsoft.AspNetCore.Mvc;
using Model;
using StubLib;
// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
namespace APILOL.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ChampionsController : ControllerBase
{
IChampionsManager dataManager;
public ChampionsController(IDataManager dataManager)
{
this.dataManager = dataManager.ChampionsMgr;
}
// GET: api/<ChampionController>
[HttpGet]
public async Task<IActionResult> Get(int index, int count)
{
var champions = await dataManager.GetItems(index, count);
IEnumerable<ChampionDTO> items = champions.Select(c => c.ToDto());
return Ok(items);
}
// GET api/<ChampionController>/5
[HttpGet("{name}")]
public async Task<IActionResult> Get(string name)
{
if (dataManager.GetNbItemsByName(name) != null)
{
return Ok(dataManager.GetItemsByName(name, 0, await dataManager.GetNbItems()));
}
return NotFound();
}
// POST api/<ChampionController>
[HttpPost]
public async Task<IActionResult> Post([FromBody] ChampionDTO championDTO)
{
return CreatedAtAction(nameof(Get),(await dataManager.AddItem(championDTO.ToModel())).ToDto);
}
// PUT api/<ChampionController>/5
[HttpPut("{name}")]
public async Task<IActionResult> PutAsync(string name, [FromBody] ChampionDTO championDTO)
{
var dtos = (await dataManager.GetItemsByName(name, 0, await dataManager.GetNbItems()));
return Ok(dataManager.UpdateItem(dtos.First(), championDTO.ToModel()));
}
// DELETE api/<ChampionController>/5
[HttpDelete("{name}")]
public async Task<IActionResult> Delete(string name)
{
var dtos = (await dataManager.GetItemsByName(name, 0, await dataManager.GetNbItems()));
return Ok(dataManager.DeleteItem(dtos.First()));
}
}
}

@ -2,12 +2,12 @@
{ {
public class PageRequest public class PageRequest
{ {
public bool isDesc { get; set; } = false; public bool IsDesc { get; set; } = false;
public int offset { get; set; } = 0; public int Offset { get; set; } = 0;
public string? orderingPropertyName { get; set; } = "Name"; public string? OrderingPropertyName { get; set; } = "Name";
public int limit { get; set; } = 10; public int Limit { get; set; } = 10;
} }
} }

@ -34,22 +34,23 @@ namespace APILOL.Controllers.v1
[HttpGet] [HttpGet]
public async Task<IActionResult> Get([FromQuery] PageRequest request) public async Task<IActionResult> Get([FromQuery] PageRequest request)
{ {
_logger.LogInformation("API call - [GET] - CHAMPION"); _logger.LogInformation("API call - [GET] - CHAMPION ");
try try
{ {
var total = await dataManager.GetNbItems(); var total = await dataManager.GetNbItems();
var champions = await dataManager.GetItems(request.offset, request.limit, request.orderingPropertyName, request.isDesc); var champions = await dataManager.GetItems(request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<ChampionDTO> items = champions.Select(c => c.ToDto()); IEnumerable<ChampionDTO> items = champions.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No champion found."); _logger.LogError("No champion found.");
return NotFound("No champion found."); return NotFound("No champion found.");
} }
return Ok(items); return Ok(new {data= items,count= await dataManager.GetNbItems(), offset = request.Offset, limit = request.Limit});
} }
catch(Exception error) catch(Exception error)
{ {
_logger.LogInformation("Error in the request");
return BadRequest(error.Message); return BadRequest(error.Message);
} }
@ -60,25 +61,26 @@ namespace APILOL.Controllers.v1
[HttpGet("{name}")] [HttpGet("{name}")]
public async Task<IActionResult> Get([FromQuery] PageRequest request,string name) public async Task<IActionResult> Get([FromQuery] PageRequest request,string name)
{ {
_logger.LogInformation("API call - [GET / NAME] - CHAMPION"); _logger.LogInformation("API call - [GET / NAME] - CHAMPION {name}", name);
try try
{ {
if (dataManager.GetNbItemsByName(name) != null) if (dataManager.GetNbItemsByName(name) != null)
{ {
var champions = await dataManager.GetItemsByName(name, request.offset, request.limit, request.orderingPropertyName, request.isDesc); var champions = await dataManager.GetItemsByName(name, request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable <ChampionDTO> items = champions.Select(c => c.ToDto()); IEnumerable <ChampionDTO> items = champions.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No champion found."); _logger.LogError("No champion found.");
return NotFound("No champion found."); return NotFound("No champion found.");
} }
return Ok(items); return Ok(new {data= items,count= dataManager.GetNbItems()});
} }
return NotFound("No champion matching with this name."); return NotFound("No champion matching with this name.");
} }
catch (Exception error) catch (Exception error)
{ {
_logger.LogInformation("Error in the request");
return BadRequest(error.Message); return BadRequest(error.Message);
} }
} }
@ -97,7 +99,7 @@ namespace APILOL.Controllers.v1
await dataManager.AddItem(championDTO.ToModel()); await dataManager.AddItem(championDTO.ToModel());
return CreatedAtAction(nameof(Get), championDTO); return CreatedAtAction(nameof(Get), championDTO);
} }
_logger.LogInformation("A champion already exist with this Name. ( Unique Name )"); _logger.LogError("A champion already exist with this Name. ( Unique Name )");
return BadRequest("A champion already exist with this Name. ( Unique Name )"); return BadRequest("A champion already exist with this Name. ( Unique Name )");
} }
catch (Exception error) catch (Exception error)
@ -128,13 +130,13 @@ namespace APILOL.Controllers.v1
return Ok(); return Ok();
} }
_logger.LogInformation("champion already exist with this unique name."); _logger.LogError("champion already exist with this unique name.");
return BadRequest("champion already exist with this unique name."); return BadRequest("champion already exist with this unique name.");
} }
else else
{ {
_logger.LogInformation("champion not found."); _logger.LogError("champion not found.");
return NotFound("champion not found."); return NotFound("champion not found.");
} }
await dataManager.UpdateItem(champion.First(), championDTO.ToModel()); await dataManager.UpdateItem(champion.First(), championDTO.ToModel());
@ -143,6 +145,7 @@ namespace APILOL.Controllers.v1
} }
catch (Exception e) catch (Exception e)
{ {
_logger.LogInformation("Error in the request");
return BadRequest(e.Message); return BadRequest(e.Message);
} }
@ -166,13 +169,14 @@ namespace APILOL.Controllers.v1
} }
else else
{ {
_logger.LogInformation("No matching Champion with this name"); _logger.LogError("No matching Champion with this name");
return NotFound("No matching Champion with this name"); return NotFound("No matching Champion with this name");
} }
} }
catch(Exception error) catch(Exception error)
{ {
_logger.LogInformation("Error in the request");
return BadRequest(error); return BadRequest(error);
} }
} }

@ -37,14 +37,14 @@ namespace APILOL.Controllers.v1
{ {
var total = await dataManager.GetNbItems(); var total = await dataManager.GetNbItems();
var runes = await dataManager.GetItems(request.offset, request.limit, request.orderingPropertyName, request.isDesc); var runes = await dataManager.GetItems(request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<RuneDTO> items = runes.Select(c => c.ToDto()); IEnumerable<RuneDTO> items = runes.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No rune found."); _logger.LogInformation("No rune found.");
return NotFound("No rune found."); return NotFound("No rune found.");
} }
return Ok(items); return Ok(new { data = items, count = await dataManager.GetNbItems(), offset = request.Offset, limit = request.Limit });
} }
catch (Exception error) catch (Exception error)
{ {
@ -63,7 +63,7 @@ namespace APILOL.Controllers.v1
{ {
if (dataManager.GetNbItemsByName(name) != null) if (dataManager.GetNbItemsByName(name) != null)
{ {
var runes = await dataManager.GetItemsByName(name, request.offset, request.limit, request.orderingPropertyName, request.isDesc); var runes = await dataManager.GetItemsByName(name, request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<RuneDTO> items = runes.Select(c => c.ToDto()); IEnumerable<RuneDTO> items = runes.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {

@ -37,14 +37,14 @@ namespace APILOL.Controllers.v1
{ {
var total = await dataManager.GetNbItems(); var total = await dataManager.GetNbItems();
var runePages = await dataManager.GetItems(request.offset, request.limit, request.orderingPropertyName, request.isDesc); var runePages = await dataManager.GetItems(request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<RunePageDTO> items = runePages.Select(c => c.ToDto()); IEnumerable<RunePageDTO> items = runePages.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No runePage found."); _logger.LogInformation("No runePage found.");
return NotFound("No runePage found."); return NotFound("No runePage found.");
} }
return Ok(items); return Ok(new { data = items, count = await dataManager.GetNbItems(), offset = request.Offset, limit = request.Limit });
} }
catch (Exception error) catch (Exception error)
{ {
@ -63,7 +63,7 @@ namespace APILOL.Controllers.v1
{ {
if (dataManager.GetNbItemsByName(name) != null) if (dataManager.GetNbItemsByName(name) != null)
{ {
var runepages = await dataManager.GetItemsByName(name, request.offset, request.limit, request.orderingPropertyName, request.isDesc); var runepages = await dataManager.GetItemsByName(name, request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<RunePageDTO> items = runepages.Select(c => c.ToDto()); IEnumerable<RunePageDTO> items = runepages.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {

@ -35,14 +35,14 @@ namespace APILOL.Controllers.v1
{ {
var total = await dataManager.GetNbItems(); var total = await dataManager.GetNbItems();
var skins = await dataManager.GetItems(request.offset, request.limit, request.orderingPropertyName, request.isDesc); var skins = await dataManager.GetItems(request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<SkinDTO> items = skins.Select(c => c.ToDto()); IEnumerable<SkinDTO> items = skins.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No skin found."); _logger.LogInformation("No skin found.");
return NotFound("No skin found."); return NotFound("No skin found.");
} }
return Ok(items); return Ok(new { data = items, count = await dataManager.GetNbItems(), offset = request.Offset, limit = request.Limit });
} }
catch (Exception error) catch (Exception error)
{ {
@ -61,7 +61,7 @@ namespace APILOL.Controllers.v1
{ {
if (dataManager.GetNbItemsByName(name) != null) if (dataManager.GetNbItemsByName(name) != null)
{ {
var skins = await dataManager.GetItemsByName(name, request.offset, request.limit, request.orderingPropertyName, request.isDesc); var skins = await dataManager.GetItemsByName(name, request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<SkinDTO> items = skins.Select(c => c.ToDto()); IEnumerable<SkinDTO> items = skins.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {

@ -24,7 +24,7 @@ namespace APILOL.Controllers.v2
{ {
this.dataManager = dataManager.ChampionsMgr; this.dataManager = dataManager.ChampionsMgr;
this._logger = logger; this._logger = logger;
} }
@ -32,54 +32,55 @@ namespace APILOL.Controllers.v2
// GET: api/<ChampionController> // GET: api/<ChampionController>
[MapToApiVersion("2.0")] [MapToApiVersion("2.0")]
[HttpGet] [HttpGet]
public async Task<IActionResult> Get([FromQuery] PageRequest request) public async Task<IActionResult> Get([FromQuery] PageRequest request)
{ {
_logger.LogInformation("API call - [GET] - CHAMPION"); _logger.LogInformation("API call - [GET] - CHAMPION ");
try try
{ {
var total = await dataManager.GetNbItems(); var total = await dataManager.GetNbItems();
var champions = await dataManager.GetItems(request.offset, request.limit, request.orderingPropertyName, request.isDesc); var champions = await dataManager.GetItems(request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<ChampionDTO> items = champions.Select(c => c.ToDto()); IEnumerable<ChampionDTO> items = champions.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No champion found."); _logger.LogError("No champion found.");
return NotFound("No champion found."); return NotFound("No champion found.");
} }
return Ok(items); return Ok(new { data = items, count = await dataManager.GetNbItems(), offset = request.Offset, limit = request.Limit });
} }
catch(Exception error) catch (Exception error)
{ {
_logger.LogInformation("Error in the request");
return BadRequest(error.Message); return BadRequest(error.Message);
} }
} }
// GET api/<ChampionController>/5 // GET api/<ChampionController>/5
[MapToApiVersion("2.0")] [MapToApiVersion("2.0")]
[HttpGet("{name}")] [HttpGet("{name}")]
public async Task<IActionResult> Get([FromQuery] PageRequest request,string name) public async Task<IActionResult> Get([FromQuery] PageRequest request, string name)
{ {
_logger.LogInformation("API call - [GET / NAME] - CHAMPION"); _logger.LogInformation("API call - [GET / NAME] - CHAMPION {name}", name);
try try
{ {
if (dataManager.GetNbItemsByName(name) != null) if (dataManager.GetNbItemsByName(name) != null)
{ {
var champions = await dataManager.GetItemsByName(name, request.offset, request.limit, request.orderingPropertyName, request.isDesc); var champions = await dataManager.GetItemsByName(name, request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable <ChampionDTO> items = champions.Select(c => c.ToDto()); IEnumerable<ChampionDTO> items = champions.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No champion found."); _logger.LogError("No champion found.");
return NotFound("No champion found."); return NotFound("No champion found.");
} }
return Ok(items); return Ok(new { data = items, count = dataManager.GetNbItems() });
} }
return NotFound("No champion matching with this name."); return NotFound("No champion matching with this name.");
} }
catch (Exception error) catch (Exception error)
{ {
_logger.LogInformation("Error in the request");
return BadRequest(error.Message); return BadRequest(error.Message);
} }
} }
@ -93,12 +94,12 @@ namespace APILOL.Controllers.v2
try try
{ {
if(await dataManager.GetNbItemsByName(championDTO.Name) == 0) if (await dataManager.GetNbItemsByName(championDTO.Name) == 0)
{ {
await dataManager.AddItem(championDTO.ToModel()); await dataManager.AddItem(championDTO.ToModel());
return CreatedAtAction(nameof(Get), championDTO); return CreatedAtAction(nameof(Get), championDTO);
} }
_logger.LogInformation("A champion already exist with this Name. ( Unique Name )"); _logger.LogError("A champion already exist with this Name. ( Unique Name )");
return BadRequest("A champion already exist with this Name. ( Unique Name )"); return BadRequest("A champion already exist with this Name. ( Unique Name )");
} }
catch (Exception error) catch (Exception error)
@ -118,24 +119,24 @@ namespace APILOL.Controllers.v2
{ {
var champion = await dataManager var champion = await dataManager
.GetItemsByName(name, 0, await dataManager.GetNbItems()); .GetItemsByName(name, 0, await dataManager.GetNbItems());
Console.WriteLine(champion.First().Name) ; Console.WriteLine(champion.First().Name);
var champion2 = await dataManager var champion2 = await dataManager
.GetItemsByName(championDTO.Name, 0, await dataManager.GetNbItems()); .GetItemsByName(championDTO.Name, 0, await dataManager.GetNbItems());
if (champion != null) if (champion != null)
{ {
if(champion2.Count() == 0) if (champion2.Count() == 0)
{ {
await dataManager.UpdateItem(champion.First(), championDTO.ToModel()); await dataManager.UpdateItem(champion.First(), championDTO.ToModel());
return Ok(); return Ok();
} }
_logger.LogInformation("champion already exist with this unique name."); _logger.LogError("champion already exist with this unique name.");
return BadRequest("champion already exist with this unique name."); return BadRequest("champion already exist with this unique name.");
} }
else else
{ {
_logger.LogInformation("champion not found."); _logger.LogError("champion not found.");
return NotFound("champion not found."); return NotFound("champion not found.");
} }
await dataManager.UpdateItem(champion.First(), championDTO.ToModel()); await dataManager.UpdateItem(champion.First(), championDTO.ToModel());
@ -144,6 +145,7 @@ namespace APILOL.Controllers.v2
} }
catch (Exception e) catch (Exception e)
{ {
_logger.LogInformation("Error in the request");
return BadRequest(e.Message); return BadRequest(e.Message);
} }
@ -158,7 +160,7 @@ namespace APILOL.Controllers.v2
try try
{ {
var champion = await (dataManager.GetItemsByName(name, 0, await dataManager.GetNbItems())); var champion = await (dataManager.GetItemsByName(name, 0, await dataManager.GetNbItems()));
if (champion.Count() != 0) if (champion.Count() != 0)
{ {
var championDto = champion.First().ToDto(); var championDto = champion.First().ToDto();
@ -167,13 +169,14 @@ namespace APILOL.Controllers.v2
} }
else else
{ {
_logger.LogInformation("No matching Champion with this name"); _logger.LogError("No matching Champion with this name");
return NotFound("No matching Champion with this name"); return NotFound("No matching Champion with this name");
} }
} }
catch(Exception error) catch (Exception error)
{ {
_logger.LogInformation("Error in the request");
return BadRequest(error); return BadRequest(error);
} }
} }

@ -37,14 +37,14 @@ namespace APILOL.Controllers.v2
{ {
var total = await dataManager.GetNbItems(); var total = await dataManager.GetNbItems();
var runes = await dataManager.GetItems(request.offset, request.limit, request.orderingPropertyName, request.isDesc); var runes = await dataManager.GetItems(request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<RuneDTO> items = runes.Select(c => c.ToDto()); IEnumerable<RuneDTO> items = runes.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No rune found."); _logger.LogInformation("No rune found.");
return NotFound("No rune found."); return NotFound("No rune found.");
} }
return Ok(items); return Ok(new { data = items, count = await dataManager.GetNbItems(), offset = request.Offset, limit = request.Limit });
} }
catch (Exception error) catch (Exception error)
{ {
@ -63,7 +63,7 @@ namespace APILOL.Controllers.v2
{ {
if (dataManager.GetNbItemsByName(name) != null) if (dataManager.GetNbItemsByName(name) != null)
{ {
var runes = await dataManager.GetItemsByName(name, request.offset, request.limit, request.orderingPropertyName, request.isDesc); var runes = await dataManager.GetItemsByName(name, request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<RuneDTO> items = runes.Select(c => c.ToDto()); IEnumerable<RuneDTO> items = runes.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {

@ -37,14 +37,14 @@ namespace APILOL.Controllers.v2
{ {
var total = await dataManager.GetNbItems(); var total = await dataManager.GetNbItems();
var runePages = await dataManager.GetItems(request.offset, request.limit, request.orderingPropertyName, request.isDesc); var runePages = await dataManager.GetItems(request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<RunePageDTO> items = runePages.Select(c => c.ToDto()); IEnumerable<RunePageDTO> items = runePages.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No runePage found."); _logger.LogInformation("No runePage found.");
return NotFound("No runePage found."); return NotFound("No runePage found.");
} }
return Ok(items); return Ok(new { data = items, count = await dataManager.GetNbItems(), offset = request.Offset, limit = request.Limit });
} }
catch (Exception error) catch (Exception error)
{ {
@ -63,7 +63,7 @@ namespace APILOL.Controllers.v2
{ {
if (dataManager.GetNbItemsByName(name) != null) if (dataManager.GetNbItemsByName(name) != null)
{ {
var runepages = await dataManager.GetItemsByName(name, request.offset, request.limit, request.orderingPropertyName, request.isDesc); var runepages = await dataManager.GetItemsByName(name, request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<RunePageDTO> items = runepages.Select(c => c.ToDto()); IEnumerable<RunePageDTO> items = runepages.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {

@ -35,14 +35,14 @@ namespace APILOL.Controllers.v2
{ {
var total = await dataManager.GetNbItems(); var total = await dataManager.GetNbItems();
var skins = await dataManager.GetItems(request.offset, request.limit, request.orderingPropertyName, request.isDesc); var skins = await dataManager.GetItems(request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<SkinDTO> items = skins.Select(c => c.ToDto()); IEnumerable<SkinDTO> items = skins.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {
_logger.LogInformation("No skin found."); _logger.LogInformation("No skin found.");
return NotFound("No skin found."); return NotFound("No skin found.");
} }
return Ok(items); return Ok(new { data = items, count = await dataManager.GetNbItems(), offset = request.Offset, limit = request.Limit });
} }
catch (Exception error) catch (Exception error)
{ {
@ -61,7 +61,7 @@ namespace APILOL.Controllers.v2
{ {
if (dataManager.GetNbItemsByName(name) != null) if (dataManager.GetNbItemsByName(name) != null)
{ {
var skins = await dataManager.GetItemsByName(name, request.offset, request.limit, request.orderingPropertyName, request.isDesc); var skins = await dataManager.GetItemsByName(name, request.Offset, request.Limit, request.OrderingPropertyName, request.IsDesc);
IEnumerable<SkinDTO> items = skins.Select(c => c.ToDto()); IEnumerable<SkinDTO> items = skins.Select(c => c.ToDto());
if (items.Count() == 0) if (items.Count() == 0)
{ {

@ -1,4 +1,6 @@
using DTO; using DTO;
using EntityFrameworkLOL.DBContexts;
using EntityFrameworkLOL.Entities;
using Model; using Model;
namespace APILOL.Mapper namespace APILOL.Mapper
@ -11,12 +13,43 @@ namespace APILOL.Mapper
{ {
Name = champion.Name, Name = champion.Name,
Bio = champion.Bio, Bio = champion.Bio,
Class = champion.Class,
Icon = champion.Icon,
Image = champion.Image,
Skills = champion.Skills.Select(skill => skill.ToDto()),
}; };
} }
public static Champion ToModel(this ChampionDTO champion) public static Champion ToModel(this ChampionDTO champion)
{ {
return new Champion(champion.Name); return new Champion(champion.Name, champion.Class, champion.Icon, champion.Image.ToString(), champion.Bio);
}
public static Champion ToModel(this ChampionEntity entity)
{
var champion = new Champion(entity.Name, entity.Class, entity.Icon, "", entity.Bio);
if (entity.Skills != null) foreach (var s in entity.Skills) { champion.AddSkill(s.ToModel()); }
if (entity.Characteristics != null) foreach (var c in entity.Characteristics) { champion.AddCharacteristics(c.ToModel()); }
return champion;
}
public static ChampionEntity ToEntity(this Champion item, SQLiteContext context)
{
ChampionEntity? championEntity = context.Champion.Find(item.Name);
if (championEntity == null)
{
championEntity = new()
{
Name = item.Name,
Bio = item.Bio,
Icon = item.Icon,
Class = item.Class,
Image = new() { Base64 = item.Image.Base64 },
};
championEntity.Skills = item.Skills.Select(x => x.ToEntity(championEntity, context)).ToList();
championEntity.Characteristics = item.Characteristics.Select(x => x.ToEntity(championEntity, context)).ToList();
}
return championEntity;
} }
} }
} }

@ -0,0 +1,26 @@
using EntityFrameworkLOL.DBContexts;
using EntityFrameworkLOL.Entities;
namespace APILOL.Mapper
{
public static class CharacteristicsMapper
{
public static CharacteristicEntity ToEntity(this KeyValuePair<string, int> item, ChampionEntity champion, SQLiteContext context)
{
var characteristicEntity = context.Characteristic.Find(item.Key, champion.Name);
if (characteristicEntity == null)
{
return new()
{
Name = item.Key,
Value = item.Value,
};
}
return characteristicEntity;
}
public static Tuple<string, int> ToModel(this CharacteristicEntity entity)
=> new(entity.Name, entity.Value);
}
}

@ -1,4 +1,6 @@
using DTO; using DTO;
using EntityFrameworkLOL.DBContexts;
using EntityFrameworkLOL.Entities;
using Model; using Model;
namespace APILOL.Mapper namespace APILOL.Mapper
@ -20,5 +22,25 @@ namespace APILOL.Mapper
{ {
return new Rune(rune.Name, rune.Family, rune.Image, rune.Image, rune.Description); return new Rune(rune.Name, rune.Family, rune.Image, rune.Image, rune.Description);
} }
public static Rune ToModel(this RuneEntity entity)
{
return new Rune(entity.Name, entity.Family, "", entity.Image.Base64, entity.Description);
}
public static RuneEntity ToEntity(this Rune item, SQLiteContext context)
{
RuneEntity? runeEntity = context.Rune.Find(item.Name);
if (runeEntity == null)
{
return new()
{
Name = item.Name,
Description = item.Description,
Family = item.Family
};
}
return runeEntity;
}
} }
} }

@ -1,4 +1,6 @@
using DTO; using DTO;
using EntityFrameworkLOL.DBContexts;
using EntityFrameworkLOL.Entities;
using Model; using Model;
namespace APILOL.Mapper namespace APILOL.Mapper
@ -18,5 +20,37 @@ namespace APILOL.Mapper
{ {
return new RunePage(runePage.Name); return new RunePage(runePage.Name);
} }
public static RunePage ToModel(this RunePageEntity entity, SQLiteContext context)
{
RunePage runePage = new(entity.Name);
if (entity.Runes != null)
{
foreach (var r in entity.Runes)
{
var rune = context.Rune.Find(r.Name);
//if (rune != null) runePage[r.category] = rune.ToModel();
};
}
return runePage;
}
public static RunePageEntity ToEntity(this RunePage item, SQLiteContext context)
{
RunePageEntity? runePageEntity = context.RunePage.Find(item.Name);
if (runePageEntity == null)
{
runePageEntity = new()
{
Name = item.Name,
};
runePageEntity.Runes = new List<RuneEntity>();
foreach (var r in item.Runes)
{
runePageEntity.Runes.Add(r.Value.ToEntity(context));
}
}
return runePageEntity;
}
} }
} }

@ -0,0 +1,46 @@
using DTO;
using EntityFrameworkLOL.DBContexts;
using EntityFrameworkLOL.Entities;
using Model;
namespace APILOL.Mapper
{
public static class SkillMapper
{
public static SkillEntity ToEntity(this Skill item, ChampionEntity champion, SQLiteContext context)
{
var skillEntity = context.Skill.Find(item.Name);
if (skillEntity == null)
{
return new()
{
Name = item.Name,
Description = item.Description,
Type = item.Type,
Champions = new List<ChampionEntity>() { champion }
};
}
skillEntity!.Champions?.Add(champion);
return skillEntity;
}
public static Skill ToModel(this SkillEntity entity)
=> new(entity.Name, entity.Type, entity.Description);
public static SkillDTO ToDto(this Skill skill)
{
return new SkillDTO()
{
Type = skill.Type,
Name = skill.Name,
Description = skill.Description
};
}
public static Skill ToModel(this SkillDTO skill)
{
return new Skill(skill.Name, skill.Type, skill.Description);
}
}
}

@ -1,4 +1,6 @@
using DTO; using DTO;
using EntityFrameworkLOL.DBContexts;
using EntityFrameworkLOL.Entities;
using Model; using Model;
namespace APILOL.Mapper namespace APILOL.Mapper
@ -22,5 +24,23 @@ namespace APILOL.Mapper
{ {
return new Skin(skin.Name, skin.Champion.ToModel(),skin.Price, skin.Image, skin.Icon, skin.Description); return new Skin(skin.Name, skin.Champion.ToModel(),skin.Price, skin.Image, skin.Icon, skin.Description);
} }
public static Skin ToModel(this SkinEntity entity)
{
return new Skin(entity.Name, entity.ChampionSkin.ToModel(), entity.Price, entity.Icon, entity.Description);
}
public static SkinEntity ToEntity(this Skin item, SQLiteContext? context = null)
{
return new()
{
Name = item.Name,
ChampionSkin = context?.Champion.Find(item.Champion.Name) ?? item.Champion.ToEntity(context),
Description = item.Description,
Icon = item.Icon,
Image = null,
Price = item.Price
};
}
} }
} }

@ -1,37 +1,37 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Versioning; using Microsoft.AspNetCore.Mvc.Versioning;
using Model; using Model;
using StubLib; using StubLib;
using Swashbuckle.Swagger;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IDataManager, StubData>(); builder.Services.AddSingleton<IDataManager, StubData>();
builder.Services.AddControllers();
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(); builder.Services.AddSwaggerGen();
builder.Services.AddApiVersioning(opt => builder.Services.AddApiVersioning(opt =>
{ {
opt.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0); opt.DefaultApiVersion = new ApiVersion(1, 0);
opt.AssumeDefaultVersionWhenUnspecified = true; opt.ApiVersionReader = new UrlSegmentApiVersionReader();
opt.ReportApiVersions = true;
opt.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(),
new HeaderApiVersionReader("x-api-version"),
new MediaTypeApiVersionReader("x-api-version"));
}); });
// Add ApiExplorer to discover versions
builder.Services.AddVersionedApiExplorer(setup => builder.Services.AddVersionedApiExplorer(setup =>
{ {
setup.GroupNameFormat = "'v'VVV"; setup.GroupNameFormat = "'v'VVV";
setup.SubstituteApiVersionInUrl = true; setup.SubstituteApiVersionInUrl = true;
}); });
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
var app = builder.Build();
var apiVersionDescriptionProvider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>(); var apiVersionDescriptionProvider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
@ -48,6 +48,8 @@ if (app.Environment.IsDevelopment())
}); });
} }
app.UseStaticFiles(); app.UseStaticFiles();
app.UseHttpsRedirection(); app.UseHttpsRedirection();
@ -56,4 +58,4 @@ app.UseAuthorization();
app.MapControllers(); app.MapControllers();
app.Run(); app.Run();

@ -1,8 +1,22 @@
namespace DTO using Model;
using System.Collections.Immutable;
using System.Collections.ObjectModel;
namespace DTO
{ {
public class ChampionDTO public class ChampionDTO
{ {
public string Name { get; set; } public string Name { get; set; }
public string Bio { get; set; } public string Bio { get; set; }
public ChampionClass Class { get; set; }
public string Icon { get; set; }
public LargeImage Image { get; set; }
public IEnumerable<SkillDTO> Skills { get; set; }
} }
} }

@ -14,6 +14,8 @@
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -0,0 +1,20 @@
using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DTO
{
public class SkillDTO
{
public SkillType Type { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
}

@ -1,34 +1,131 @@
using EntityFrameworkLOL.Entities; using EntityFrameworkLOL.Entities;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Model;
namespace EntityFrameworkLOL.DBContexts namespace EntityFrameworkLOL.DBContexts
{ {
class SQLiteContext : DbContext public class SQLiteContext : DbContext
{ {
public DbSet<CategoryEntity> Category { get; set; }
public DbSet<RuneFamilyEntity> RuneFamily { get; set; }
public DbSet<ImageEntity> Image { get; set; } public DbSet<ImageEntity> Image { get; set; }
public DbSet<SkillTypeEntity> SkillType { get; set; }
public DbSet<SkillEntity> Skill { get; set; } public DbSet<SkillEntity> Skill { get; set; }
public DbSet<SkinEntity> Skin { get; set; } public DbSet<SkinEntity> Skin { get; set; }
public DbSet<RuneEntity> Rune { get; set; } public DbSet<RuneEntity> Rune { get; set; }
public DbSet<ChampionClassEntity> ChampionClass { get; set; }
public DbSet<RunePageEntity> RunePage { get; set; } public DbSet<RunePageEntity> RunePage { get; set; }
public DbSet<CharacteristicEntity> Characteristic { get; set; }
public DbSet<ChampionEntity> Champion { get; set; } public DbSet<ChampionEntity> Champion { get; set; }
public SQLiteContext() { }
public SQLiteContext(DbContextOptions<SQLiteContext> options)
: base(options)
{ }
protected override void OnConfiguring(DbContextOptionsBuilder options) protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source=DBLOL.db"); {
//var connection = new SqliteConnection("DataSource=:memory:");
var connection = new SqliteConnection("Data Source=DBLOL.db");
connection.Open();
options.UseSqlite(connection);
}
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
base.OnModelCreating(modelBuilder); modelBuilder.Entity<ImageEntity>().Property(i => i.Base64).ValueGeneratedOnAdd();
modelBuilder.Entity<CharacteristicEntity>().HasKey(c => new { c.Name });
modelBuilder.Entity<RunePageEntity>().Property(rp => rp.Name).ValueGeneratedOnAdd();
modelBuilder.Entity<RunePageEntity>()
.HasMany(rp => rp.Runes);
modelBuilder.Entity<ChampionEntity>()
.HasMany(c => c.RunePages)
.WithMany(rp => rp.Champions);
modelBuilder.Entity<ImageEntity>().HasData(new List<ImageEntity>()
{
new()
{
Base64 = "default"
}
});
modelBuilder.Entity<ChampionEntity>().HasData(new List<ChampionEntity>() {
new()
{
Name = "WinKer",
Bio = "Best front-end designer",
Class = ChampionClass.Mage,
Icon = "",
},
new()
{
Name = "Jonquille",
Bio = "Daffodil",
Class = ChampionClass.Support,
Icon = "",
}
});
modelBuilder.Entity<CharacteristicEntity>().HasData(new List<CharacteristicEntity>() {
new()
{
Name = "Front-end",
Value = 100,
},
new()
{
Name = "Back-end",
Value = 100,
}
});
modelBuilder.Entity<SkinEntity>().HasData(new List<SkinEntity>() {
new SkinEntity
{
Name = "Darker WinKer",
Description = "Be invisible in the darkness but never alone",
Icon = "default",
Price=9.99F
},
new SkinEntity
{
Name = "Summer Daffodil",
Description = "A jewel of Summer for all year long",
Icon = "default",
Price=9.99F
},
});
modelBuilder.Entity<SkillEntity>().HasData(new List<SkillEntity>() {
new()
{
Name = "Beautiful layout",
Description = "Bowl'In",
Type = SkillType.Ultimate
},
new()
{
Name = "DB Support",
Description = "DB",
Type = SkillType.Basic
}
});
modelBuilder.Entity<RunePageEntity>().HasData(new List<RunePageEntity>()
{
new()
{
Name="FirstRunepage"
}
});
modelBuilder.Entity<RuneEntity>().HasData(new List<RuneEntity>() {
new()
{
Name = "Mastering of Blue",
Description = "Blue shades",
Family = RuneFamily.Domination
},
new()
{
Name = "Empty Shards",
Description = "Remove runes",
Family = RuneFamily.Precision
}
});
} }
public SQLiteContext()
{ }
public SQLiteContext(DbContextOptions<SQLiteContext> options)
: base(options)
{ }
} }
} }

@ -1,24 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.Xml.Linq;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations.Schema;
using Model;
using static System.Net.Mime.MediaTypeNames;
using System.Reflection.PortableExecutable;
using System.Security.Claims;
namespace EntityFrameworkLOL.Entities
{
class CategoryEntity
{
[Key]
[ForeignKey("RunePageEntity")]
public RunePage.Category Category { get; set; }
}
}

@ -1,21 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel.DataAnnotations;
using Model;
using System.ComponentModel.DataAnnotations.Schema;
namespace EntityFrameworkLOL.Entities
{
class ChampionClassEntity
{
[Key]
[ForeignKey("ChampionEntity")]
public int Id { get; set; }
public ChampionClass Class { get; set; }
}
}

@ -12,27 +12,29 @@ using Model;
using static System.Net.Mime.MediaTypeNames; using static System.Net.Mime.MediaTypeNames;
using System.Reflection.PortableExecutable; using System.Reflection.PortableExecutable;
using System.Security.Claims; using System.Security.Claims;
using EntityFrameworkLOL.Entities;
namespace EntityFrameworkLOL.Entities namespace EntityFrameworkLOL.Entities
{ {
class ChampionEntity public class ChampionEntity
{ {
[Key] [Key]
public string Name { get; set; } public string Name { get; set; }
[Required]
public string Bio { get; set; } public string Bio { get; set; }
public string Icon { get; set; } public string? Icon { get; set; }
[NotMapped] [Required]
public Dictionary<string, int> Characteristics { get; set; } public ChampionClass Class { get; set; }
// Switch Dictionary to List puis faudra juste mapper la liste en dico
public ChampionClassEntity Class { get; set; } public ImageEntity? Image { get; set; }
public ImageEntity Image { get; set; }
//[NotMapped]
public virtual ICollection<SkillEntity> Skills { get; set; } public virtual ICollection<SkillEntity> Skills { get; set; }
public virtual ICollection<CharacteristicEntity> Characteristics { get; set; }
public virtual ICollection<RunePageEntity> RunePages { get; set; }
} }
} }

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EntityFrameworkLOL.Entities;
namespace EntityFrameworkLOL.Entities
{
public class CharacteristicEntity
{
[Key]
public string Name { get; set; }
[Required]
public int Value { get; set; }
public ChampionEntity Champion { get; set; }
//public virtual ICollection<ChampionEntity> Champions { get; set; }
}
}

@ -15,7 +15,7 @@ using System.Security.Claims;
namespace EntityFrameworkLOL.Entities namespace EntityFrameworkLOL.Entities
{ {
class ImageEntity public class ImageEntity
{ {
[Key] [Key]
[ForeignKey("ChampionEntity")] [ForeignKey("ChampionEntity")]

@ -5,10 +5,11 @@ using System.Threading.Tasks;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Model;
namespace EntityFrameworkLOL.Entities namespace EntityFrameworkLOL.Entities
{ {
class RuneEntity public class RuneEntity
{ {
[Key] [Key]
public string Name { get; set; } public string Name { get; set; }
@ -17,6 +18,9 @@ namespace EntityFrameworkLOL.Entities
public ImageEntity Image { get; set; } public ImageEntity Image { get; set; }
public RuneFamilyEntity Family { get; set; } [Required]
public RuneFamily Family { get; set; }
public virtual ICollection<RunePageEntity> RunePages { get; set; }
} }
} }

@ -1,21 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel.DataAnnotations;
using Model;
using System.ComponentModel.DataAnnotations.Schema;
namespace EntityFrameworkLOL.Entities
{
class RuneFamilyEntity
{
[Key]
[ForeignKey("RuneEntity")]
public int Id { get; set; }
public RuneFamily Family { get; set; }
}
}

@ -15,13 +15,13 @@ using System.Security.Claims;
namespace EntityFrameworkLOL.Entities namespace EntityFrameworkLOL.Entities
{ {
class RunePageEntity public class RunePageEntity
{ {
[Key] [Key]
public string Name { get; set; } public string Name { get; set; }
[NotMapped] public virtual ICollection<RuneEntity> Runes { get; set; }
public Dictionary<CategoryEntity, RuneEntity> Dictionary { get; set; }
// Switch Dictionary to List puis faudra juste mapper la liste en dico public virtual ICollection<ChampionEntity> Champions { get; set; }
} }
} }

@ -0,0 +1,19 @@
using Shared;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Model.RunePage;
namespace EntityFrameworkLOL.Entities
{
public class RunePageRuneEntity
{
public Category Category { get; set; }
public RuneEntity Rune { get; set; }
public RunePageEntity RunePage { get; set; }
}
}

@ -6,19 +6,20 @@ using System.Collections.Generic;
using System.Text; using System.Text;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Model;
namespace EntityFrameworkLOL.Entities namespace EntityFrameworkLOL.Entities
{ {
class SkillEntity public class SkillEntity
{ {
[Key] [Key]
public string Name { get; set; } public string Name { get; set; }
public string Description { get; set; } public string Description { get; set; }
public SkillTypeEntity Type { get; set; } [Required]
public SkillType Type { get; set; }
//[NotMapped]
public virtual ICollection<ChampionEntity> Champions { get; set; } public virtual ICollection<ChampionEntity> Champions { get; set; }
} }
} }

@ -1,21 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel.DataAnnotations;
using Model;
using System.ComponentModel.DataAnnotations.Schema;
namespace EntityFrameworkLOL.Entities
{
class SkillTypeEntity
{
[Key]
[ForeignKey("SkillEntity")]
public int Id { get; set; }
public SkillType Type { get; set; }
}
}

@ -8,14 +8,14 @@ using System.ComponentModel.DataAnnotations;
namespace EntityFrameworkLOL.Entities namespace EntityFrameworkLOL.Entities
{ {
class SkinEntity public class SkinEntity
{ {
[Key] [Key]
public string Name { get; set; } public string Name { get; set; }
public string Description { get; set; } public string Description { get; set; }
public string Icon { get; set; } public string? Icon { get; set; }
public float Price { get; set; } public float Price { get; set; }

@ -19,6 +19,8 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -10,8 +10,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace EntityFrameworkLOL.Migrations namespace EntityFrameworkLOL.Migrations
{ {
[DbContext(typeof(SQLiteContext))] [DbContext(typeof(SQLiteContext))]
[Migration("20230209135613_MigrationWallah5")] [Migration("20230315161305_MigrationWallah6")]
partial class MigrationWallah5 partial class MigrationWallah6
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -19,43 +19,34 @@ namespace EntityFrameworkLOL.Migrations
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); modelBuilder.HasAnnotation("ProductVersion", "7.0.2");
modelBuilder.Entity("ChampionEntitySkillEntity", b => modelBuilder.Entity("ChampionEntityRunePageEntity", b =>
{ {
b.Property<string>("ChampionsName") b.Property<string>("ChampionsName")
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<string>("SkillsName") b.Property<string>("RunePagesName")
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.HasKey("ChampionsName", "SkillsName"); b.HasKey("ChampionsName", "RunePagesName");
b.HasIndex("SkillsName"); b.HasIndex("RunePagesName");
b.ToTable("ChampionEntitySkillEntity"); b.ToTable("ChampionEntityRunePageEntity");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.CategoryEntity", b => modelBuilder.Entity("ChampionEntitySkillEntity", b =>
{ {
b.Property<int>("Category") b.Property<string>("ChampionsName")
.HasColumnType("INTEGER"); .HasColumnType("TEXT");
b.HasKey("Category");
b.ToTable("Category");
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionClassEntity", b => b.Property<string>("SkillsName")
{ .HasColumnType("TEXT");
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("Class") b.HasKey("ChampionsName", "SkillsName");
.HasColumnType("INTEGER");
b.HasKey("Id"); b.HasIndex("SkillsName");
b.ToTable("ChampionClass"); b.ToTable("ChampionEntitySkillEntity");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionEntity", b =>
@ -67,34 +58,83 @@ namespace EntityFrameworkLOL.Migrations
.IsRequired() .IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<int>("ClassId") b.Property<int>("Class")
.HasColumnType("INTEGER"); .HasColumnType("INTEGER");
b.Property<string>("Icon") b.Property<string>("Icon")
.IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<string>("ImageBase64") b.Property<string>("ImageBase64")
.IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.HasKey("Name"); b.HasKey("Name");
b.HasIndex("ClassId");
b.HasIndex("ImageBase64"); b.HasIndex("ImageBase64");
b.ToTable("Champion"); b.ToTable("Champion");
b.HasData(
new
{
Name = "WinKer",
Bio = "Best front-end designer",
Class = 3,
Icon = ""
},
new
{
Name = "Jonquille",
Bio = "Daffodil",
Class = 5,
Icon = ""
});
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.CharacteristicEntity", b =>
{
b.Property<string>("Name")
.HasColumnType("TEXT");
b.Property<string>("ChampionName")
.HasColumnType("TEXT");
b.Property<int>("Value")
.HasColumnType("INTEGER");
b.HasKey("Name");
b.HasIndex("ChampionName");
b.ToTable("Characteristic");
b.HasData(
new
{
Name = "Front-end",
Value = 100
},
new
{
Name = "Back-end",
Value = 100
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.ImageEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.ImageEntity", b =>
{ {
b.Property<string>("Base64") b.Property<string>("Base64")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.HasKey("Base64"); b.HasKey("Base64");
b.ToTable("Image"); b.ToTable("Image");
b.HasData(
new
{
Base64 = "default"
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneEntity", b =>
@ -106,7 +146,7 @@ namespace EntityFrameworkLOL.Migrations
.IsRequired() .IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<int>("FamilyId") b.Property<int>("Family")
.HasColumnType("INTEGER"); .HasColumnType("INTEGER");
b.Property<string>("ImageBase64") b.Property<string>("ImageBase64")
@ -114,35 +154,40 @@ namespace EntityFrameworkLOL.Migrations
b.HasKey("Name"); b.HasKey("Name");
b.HasIndex("FamilyId");
b.HasIndex("ImageBase64"); b.HasIndex("ImageBase64");
b.ToTable("Rune"); b.ToTable("Rune");
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneFamilyEntity", b => b.HasData(
{ new
b.Property<int>("Id") {
.ValueGeneratedOnAdd() Name = "Mastering of Blue",
.HasColumnType("INTEGER"); Description = "Blue shades",
Family = 2
b.Property<int>("Family") },
.HasColumnType("INTEGER"); new
{
b.HasKey("Id"); Name = "Empty Shards",
Description = "Remove runes",
b.ToTable("RuneFamily"); Family = 1
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.RunePageEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.RunePageEntity", b =>
{ {
b.Property<string>("Name") b.Property<string>("Name")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.HasKey("Name"); b.HasKey("Name");
b.ToTable("RunePage"); b.ToTable("RunePage");
b.HasData(
new
{
Name = "FirstRunepage"
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkillEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.SkillEntity", b =>
@ -154,28 +199,26 @@ namespace EntityFrameworkLOL.Migrations
.IsRequired() .IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<int>("TypeId") b.Property<int>("Type")
.HasColumnType("INTEGER"); .HasColumnType("INTEGER");
b.HasKey("Name"); b.HasKey("Name");
b.HasIndex("TypeId");
b.ToTable("Skill"); b.ToTable("Skill");
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkillTypeEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("Type")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.ToTable("SkillType"); b.HasData(
new
{
Name = "Beautiful layout",
Description = "Bowl'In",
Type = 3
},
new
{
Name = "DB Support",
Description = "DB",
Type = 1
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkinEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.SkinEntity", b =>
@ -191,7 +234,6 @@ namespace EntityFrameworkLOL.Migrations
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<string>("Icon") b.Property<string>("Icon")
.IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<string>("ImageBase64") b.Property<string>("ImageBase64")
@ -207,9 +249,40 @@ namespace EntityFrameworkLOL.Migrations
b.HasIndex("ImageBase64"); b.HasIndex("ImageBase64");
b.ToTable("Skin"); b.ToTable("Skin");
b.HasData(
new
{
Name = "Darker WinKer",
Description = "Be invisible in the darkness but never alone",
Icon = "default",
Price = 9.99f
},
new
{
Name = "Summer Daffodil",
Description = "A jewel of Summer for all year long",
Icon = "default",
Price = 9.99f
});
}); });
modelBuilder.Entity("ChampionEntitySkillEntity", b => modelBuilder.Entity("RuneEntityRunePageEntity", b =>
{
b.Property<string>("RunePagesName")
.HasColumnType("TEXT");
b.Property<string>("RunesName")
.HasColumnType("TEXT");
b.HasKey("RunePagesName", "RunesName");
b.HasIndex("RunesName");
b.ToTable("RuneEntityRunePageEntity");
});
modelBuilder.Entity("ChampionEntityRunePageEntity", b =>
{ {
b.HasOne("EntityFrameworkLOL.Entities.ChampionEntity", null) b.HasOne("EntityFrameworkLOL.Entities.ChampionEntity", null)
.WithMany() .WithMany()
@ -217,58 +290,53 @@ namespace EntityFrameworkLOL.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("EntityFrameworkLOL.Entities.SkillEntity", null) b.HasOne("EntityFrameworkLOL.Entities.RunePageEntity", null)
.WithMany() .WithMany()
.HasForeignKey("SkillsName") .HasForeignKey("RunePagesName")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionEntity", b => modelBuilder.Entity("ChampionEntitySkillEntity", b =>
{ {
b.HasOne("EntityFrameworkLOL.Entities.ChampionClassEntity", "Class") b.HasOne("EntityFrameworkLOL.Entities.ChampionEntity", null)
.WithMany() .WithMany()
.HasForeignKey("ClassId") .HasForeignKey("ChampionsName")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("EntityFrameworkLOL.Entities.ImageEntity", "Image") b.HasOne("EntityFrameworkLOL.Entities.SkillEntity", null)
.WithMany() .WithMany()
.HasForeignKey("ImageBase64") .HasForeignKey("SkillsName")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Class");
b.Navigation("Image");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionEntity", b =>
{ {
b.HasOne("EntityFrameworkLOL.Entities.RuneFamilyEntity", "Family")
.WithMany()
.HasForeignKey("FamilyId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntityFrameworkLOL.Entities.ImageEntity", "Image") b.HasOne("EntityFrameworkLOL.Entities.ImageEntity", "Image")
.WithMany() .WithMany()
.HasForeignKey("ImageBase64"); .HasForeignKey("ImageBase64");
b.Navigation("Family");
b.Navigation("Image"); b.Navigation("Image");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkillEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.CharacteristicEntity", b =>
{ {
b.HasOne("EntityFrameworkLOL.Entities.SkillTypeEntity", "Type") b.HasOne("EntityFrameworkLOL.Entities.ChampionEntity", "Champion")
.WithMany() .WithMany()
.HasForeignKey("TypeId") .HasForeignKey("ChampionName");
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Type"); b.Navigation("Champion");
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneEntity", b =>
{
b.HasOne("EntityFrameworkLOL.Entities.ImageEntity", "Image")
.WithMany()
.HasForeignKey("ImageBase64");
b.Navigation("Image");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkinEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.SkinEntity", b =>
@ -285,6 +353,21 @@ namespace EntityFrameworkLOL.Migrations
b.Navigation("Image"); b.Navigation("Image");
}); });
modelBuilder.Entity("RuneEntityRunePageEntity", b =>
{
b.HasOne("EntityFrameworkLOL.Entities.RunePageEntity", null)
.WithMany()
.HasForeignKey("RunePagesName")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntityFrameworkLOL.Entities.RuneEntity", null)
.WithMany()
.HasForeignKey("RunesName")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }
} }

@ -2,38 +2,16 @@
#nullable disable #nullable disable
#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional
namespace EntityFrameworkLOL.Migrations namespace EntityFrameworkLOL.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class MigrationWallah5 : Migration public partial class MigrationWallah6 : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
{ {
migrationBuilder.CreateTable(
name: "Category",
columns: table => new
{
Category = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Category", x => x.Category);
});
migrationBuilder.CreateTable(
name: "ChampionClass",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Class = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ChampionClass", x => x.Id);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Image", name: "Image",
columns: table => new columns: table => new
@ -45,19 +23,6 @@ namespace EntityFrameworkLOL.Migrations
table.PrimaryKey("PK_Image", x => x.Base64); table.PrimaryKey("PK_Image", x => x.Base64);
}); });
migrationBuilder.CreateTable(
name: "RuneFamily",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Family = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_RuneFamily", x => x.Id);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "RunePage", name: "RunePage",
columns: table => new columns: table => new
@ -70,16 +35,16 @@ namespace EntityFrameworkLOL.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "SkillType", name: "Skill",
columns: table => new columns: table => new
{ {
Id = table.Column<int>(type: "INTEGER", nullable: false) Name = table.Column<string>(type: "TEXT", nullable: false),
.Annotation("Sqlite:Autoincrement", true), Description = table.Column<string>(type: "TEXT", nullable: false),
Type = table.Column<int>(type: "INTEGER", nullable: false) Type = table.Column<int>(type: "INTEGER", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_SkillType", x => x.Id); table.PrimaryKey("PK_Skill", x => x.Name);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
@ -88,25 +53,18 @@ namespace EntityFrameworkLOL.Migrations
{ {
Name = table.Column<string>(type: "TEXT", nullable: false), Name = table.Column<string>(type: "TEXT", nullable: false),
Bio = table.Column<string>(type: "TEXT", nullable: false), Bio = table.Column<string>(type: "TEXT", nullable: false),
Icon = table.Column<string>(type: "TEXT", nullable: false), Icon = table.Column<string>(type: "TEXT", nullable: true),
ClassId = table.Column<int>(type: "INTEGER", nullable: false), Class = table.Column<int>(type: "INTEGER", nullable: false),
ImageBase64 = table.Column<string>(type: "TEXT", nullable: false) ImageBase64 = table.Column<string>(type: "TEXT", nullable: true)
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_Champion", x => x.Name); table.PrimaryKey("PK_Champion", x => x.Name);
table.ForeignKey(
name: "FK_Champion_ChampionClass_ClassId",
column: x => x.ClassId,
principalTable: "ChampionClass",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey( table.ForeignKey(
name: "FK_Champion_Image_ImageBase64", name: "FK_Champion_Image_ImageBase64",
column: x => x.ImageBase64, column: x => x.ImageBase64,
principalTable: "Image", principalTable: "Image",
principalColumn: "Base64", principalColumn: "Base64");
onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
@ -116,7 +74,7 @@ namespace EntityFrameworkLOL.Migrations
Name = table.Column<string>(type: "TEXT", nullable: false), Name = table.Column<string>(type: "TEXT", nullable: false),
Description = table.Column<string>(type: "TEXT", nullable: false), Description = table.Column<string>(type: "TEXT", nullable: false),
ImageBase64 = table.Column<string>(type: "TEXT", nullable: true), ImageBase64 = table.Column<string>(type: "TEXT", nullable: true),
FamilyId = table.Column<int>(type: "INTEGER", nullable: false) Family = table.Column<int>(type: "INTEGER", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
@ -126,40 +84,81 @@ namespace EntityFrameworkLOL.Migrations
column: x => x.ImageBase64, column: x => x.ImageBase64,
principalTable: "Image", principalTable: "Image",
principalColumn: "Base64"); principalColumn: "Base64");
});
migrationBuilder.CreateTable(
name: "ChampionEntityRunePageEntity",
columns: table => new
{
ChampionsName = table.Column<string>(type: "TEXT", nullable: false),
RunePagesName = table.Column<string>(type: "TEXT", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ChampionEntityRunePageEntity", x => new { x.ChampionsName, x.RunePagesName });
table.ForeignKey(
name: "FK_ChampionEntityRunePageEntity_Champion_ChampionsName",
column: x => x.ChampionsName,
principalTable: "Champion",
principalColumn: "Name",
onDelete: ReferentialAction.Cascade);
table.ForeignKey( table.ForeignKey(
name: "FK_Rune_RuneFamily_FamilyId", name: "FK_ChampionEntityRunePageEntity_RunePage_RunePagesName",
column: x => x.FamilyId, column: x => x.RunePagesName,
principalTable: "RuneFamily", principalTable: "RunePage",
principalColumn: "Id", principalColumn: "Name",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Skill", name: "ChampionEntitySkillEntity",
columns: table => new columns: table => new
{ {
Name = table.Column<string>(type: "TEXT", nullable: false), ChampionsName = table.Column<string>(type: "TEXT", nullable: false),
Description = table.Column<string>(type: "TEXT", nullable: false), SkillsName = table.Column<string>(type: "TEXT", nullable: false)
TypeId = table.Column<int>(type: "INTEGER", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_Skill", x => x.Name); table.PrimaryKey("PK_ChampionEntitySkillEntity", x => new { x.ChampionsName, x.SkillsName });
table.ForeignKey(
name: "FK_ChampionEntitySkillEntity_Champion_ChampionsName",
column: x => x.ChampionsName,
principalTable: "Champion",
principalColumn: "Name",
onDelete: ReferentialAction.Cascade);
table.ForeignKey( table.ForeignKey(
name: "FK_Skill_SkillType_TypeId", name: "FK_ChampionEntitySkillEntity_Skill_SkillsName",
column: x => x.TypeId, column: x => x.SkillsName,
principalTable: "SkillType", principalTable: "Skill",
principalColumn: "Id", principalColumn: "Name",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable(
name: "Characteristic",
columns: table => new
{
Name = table.Column<string>(type: "TEXT", nullable: false),
Value = table.Column<int>(type: "INTEGER", nullable: false),
ChampionName = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Characteristic", x => x.Name);
table.ForeignKey(
name: "FK_Characteristic_Champion_ChampionName",
column: x => x.ChampionName,
principalTable: "Champion",
principalColumn: "Name");
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Skin", name: "Skin",
columns: table => new columns: table => new
{ {
Name = table.Column<string>(type: "TEXT", nullable: false), Name = table.Column<string>(type: "TEXT", nullable: false),
Description = table.Column<string>(type: "TEXT", nullable: false), Description = table.Column<string>(type: "TEXT", nullable: false),
Icon = table.Column<string>(type: "TEXT", nullable: false), Icon = table.Column<string>(type: "TEXT", nullable: true),
Price = table.Column<float>(type: "REAL", nullable: false), Price = table.Column<float>(type: "REAL", nullable: false),
ImageBase64 = table.Column<string>(type: "TEXT", nullable: true), ImageBase64 = table.Column<string>(type: "TEXT", nullable: true),
ChampionSkinName = table.Column<string>(type: "TEXT", nullable: true) ChampionSkinName = table.Column<string>(type: "TEXT", nullable: true)
@ -180,48 +179,103 @@ namespace EntityFrameworkLOL.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "ChampionEntitySkillEntity", name: "RuneEntityRunePageEntity",
columns: table => new columns: table => new
{ {
ChampionsName = table.Column<string>(type: "TEXT", nullable: false), RunePagesName = table.Column<string>(type: "TEXT", nullable: false),
SkillsName = table.Column<string>(type: "TEXT", nullable: false) RunesName = table.Column<string>(type: "TEXT", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_ChampionEntitySkillEntity", x => new { x.ChampionsName, x.SkillsName }); table.PrimaryKey("PK_RuneEntityRunePageEntity", x => new { x.RunePagesName, x.RunesName });
table.ForeignKey( table.ForeignKey(
name: "FK_ChampionEntitySkillEntity_Champion_ChampionsName", name: "FK_RuneEntityRunePageEntity_RunePage_RunePagesName",
column: x => x.ChampionsName, column: x => x.RunePagesName,
principalTable: "Champion", principalTable: "RunePage",
principalColumn: "Name", principalColumn: "Name",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
table.ForeignKey( table.ForeignKey(
name: "FK_ChampionEntitySkillEntity_Skill_SkillsName", name: "FK_RuneEntityRunePageEntity_Rune_RunesName",
column: x => x.SkillsName, column: x => x.RunesName,
principalTable: "Skill", principalTable: "Rune",
principalColumn: "Name", principalColumn: "Name",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateIndex( migrationBuilder.InsertData(
name: "IX_Champion_ClassId",
table: "Champion", table: "Champion",
column: "ClassId"); columns: new[] { "Name", "Bio", "Class", "Icon", "ImageBase64" },
values: new object[,]
{
{ "Jonquille", "Daffodil", 5, "", null },
{ "WinKer", "Best front-end designer", 3, "", null }
});
migrationBuilder.InsertData(
table: "Characteristic",
columns: new[] { "Name", "ChampionName", "Value" },
values: new object[,]
{
{ "Back-end", null, 100 },
{ "Front-end", null, 100 }
});
migrationBuilder.InsertData(
table: "Image",
column: "Base64",
value: "default");
migrationBuilder.InsertData(
table: "Rune",
columns: new[] { "Name", "Description", "Family", "ImageBase64" },
values: new object[,]
{
{ "Empty Shards", "Remove runes", 1, null },
{ "Mastering of Blue", "Blue shades", 2, null }
});
migrationBuilder.InsertData(
table: "RunePage",
column: "Name",
value: "FirstRunepage");
migrationBuilder.InsertData(
table: "Skill",
columns: new[] { "Name", "Description", "Type" },
values: new object[,]
{
{ "Beautiful layout", "Bowl'In", 3 },
{ "DB Support", "DB", 1 }
});
migrationBuilder.InsertData(
table: "Skin",
columns: new[] { "Name", "ChampionSkinName", "Description", "Icon", "ImageBase64", "Price" },
values: new object[,]
{
{ "Darker WinKer", null, "Be invisible in the darkness but never alone", "default", null, 9.99f },
{ "Summer Daffodil", null, "A jewel of Summer for all year long", "default", null, 9.99f }
});
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Champion_ImageBase64", name: "IX_Champion_ImageBase64",
table: "Champion", table: "Champion",
column: "ImageBase64"); column: "ImageBase64");
migrationBuilder.CreateIndex(
name: "IX_ChampionEntityRunePageEntity_RunePagesName",
table: "ChampionEntityRunePageEntity",
column: "RunePagesName");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_ChampionEntitySkillEntity_SkillsName", name: "IX_ChampionEntitySkillEntity_SkillsName",
table: "ChampionEntitySkillEntity", table: "ChampionEntitySkillEntity",
column: "SkillsName"); column: "SkillsName");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Rune_FamilyId", name: "IX_Characteristic_ChampionName",
table: "Rune", table: "Characteristic",
column: "FamilyId"); column: "ChampionName");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Rune_ImageBase64", name: "IX_Rune_ImageBase64",
@ -229,9 +283,9 @@ namespace EntityFrameworkLOL.Migrations
column: "ImageBase64"); column: "ImageBase64");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Skill_TypeId", name: "IX_RuneEntityRunePageEntity_RunesName",
table: "Skill", table: "RuneEntityRunePageEntity",
column: "TypeId"); column: "RunesName");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Skin_ChampionSkinName", name: "IX_Skin_ChampionSkinName",
@ -248,16 +302,16 @@ namespace EntityFrameworkLOL.Migrations
protected override void Down(MigrationBuilder migrationBuilder) protected override void Down(MigrationBuilder migrationBuilder)
{ {
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Category"); name: "ChampionEntityRunePageEntity");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "ChampionEntitySkillEntity"); name: "ChampionEntitySkillEntity");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Rune"); name: "Characteristic");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "RunePage"); name: "RuneEntityRunePageEntity");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Skin"); name: "Skin");
@ -266,16 +320,13 @@ namespace EntityFrameworkLOL.Migrations
name: "Skill"); name: "Skill");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "RuneFamily"); name: "RunePage");
migrationBuilder.DropTable(
name: "Champion");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "SkillType"); name: "Rune");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "ChampionClass"); name: "Champion");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Image"); name: "Image");

@ -16,43 +16,34 @@ namespace EntityFrameworkLOL.Migrations
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); modelBuilder.HasAnnotation("ProductVersion", "7.0.2");
modelBuilder.Entity("ChampionEntitySkillEntity", b => modelBuilder.Entity("ChampionEntityRunePageEntity", b =>
{ {
b.Property<string>("ChampionsName") b.Property<string>("ChampionsName")
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<string>("SkillsName") b.Property<string>("RunePagesName")
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.HasKey("ChampionsName", "SkillsName"); b.HasKey("ChampionsName", "RunePagesName");
b.HasIndex("SkillsName"); b.HasIndex("RunePagesName");
b.ToTable("ChampionEntitySkillEntity"); b.ToTable("ChampionEntityRunePageEntity");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.CategoryEntity", b => modelBuilder.Entity("ChampionEntitySkillEntity", b =>
{ {
b.Property<int>("Category") b.Property<string>("ChampionsName")
.HasColumnType("INTEGER"); .HasColumnType("TEXT");
b.HasKey("Category");
b.ToTable("Category");
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionClassEntity", b => b.Property<string>("SkillsName")
{ .HasColumnType("TEXT");
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("Class") b.HasKey("ChampionsName", "SkillsName");
.HasColumnType("INTEGER");
b.HasKey("Id"); b.HasIndex("SkillsName");
b.ToTable("ChampionClass"); b.ToTable("ChampionEntitySkillEntity");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionEntity", b =>
@ -64,34 +55,83 @@ namespace EntityFrameworkLOL.Migrations
.IsRequired() .IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<int>("ClassId") b.Property<int>("Class")
.HasColumnType("INTEGER"); .HasColumnType("INTEGER");
b.Property<string>("Icon") b.Property<string>("Icon")
.IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<string>("ImageBase64") b.Property<string>("ImageBase64")
.IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.HasKey("Name"); b.HasKey("Name");
b.HasIndex("ClassId");
b.HasIndex("ImageBase64"); b.HasIndex("ImageBase64");
b.ToTable("Champion"); b.ToTable("Champion");
b.HasData(
new
{
Name = "WinKer",
Bio = "Best front-end designer",
Class = 3,
Icon = ""
},
new
{
Name = "Jonquille",
Bio = "Daffodil",
Class = 5,
Icon = ""
});
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.CharacteristicEntity", b =>
{
b.Property<string>("Name")
.HasColumnType("TEXT");
b.Property<string>("ChampionName")
.HasColumnType("TEXT");
b.Property<int>("Value")
.HasColumnType("INTEGER");
b.HasKey("Name");
b.HasIndex("ChampionName");
b.ToTable("Characteristic");
b.HasData(
new
{
Name = "Front-end",
Value = 100
},
new
{
Name = "Back-end",
Value = 100
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.ImageEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.ImageEntity", b =>
{ {
b.Property<string>("Base64") b.Property<string>("Base64")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.HasKey("Base64"); b.HasKey("Base64");
b.ToTable("Image"); b.ToTable("Image");
b.HasData(
new
{
Base64 = "default"
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneEntity", b =>
@ -103,7 +143,7 @@ namespace EntityFrameworkLOL.Migrations
.IsRequired() .IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<int>("FamilyId") b.Property<int>("Family")
.HasColumnType("INTEGER"); .HasColumnType("INTEGER");
b.Property<string>("ImageBase64") b.Property<string>("ImageBase64")
@ -111,35 +151,40 @@ namespace EntityFrameworkLOL.Migrations
b.HasKey("Name"); b.HasKey("Name");
b.HasIndex("FamilyId");
b.HasIndex("ImageBase64"); b.HasIndex("ImageBase64");
b.ToTable("Rune"); b.ToTable("Rune");
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneFamilyEntity", b => b.HasData(
{ new
b.Property<int>("Id") {
.ValueGeneratedOnAdd() Name = "Mastering of Blue",
.HasColumnType("INTEGER"); Description = "Blue shades",
Family = 2
b.Property<int>("Family") },
.HasColumnType("INTEGER"); new
{
b.HasKey("Id"); Name = "Empty Shards",
Description = "Remove runes",
b.ToTable("RuneFamily"); Family = 1
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.RunePageEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.RunePageEntity", b =>
{ {
b.Property<string>("Name") b.Property<string>("Name")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.HasKey("Name"); b.HasKey("Name");
b.ToTable("RunePage"); b.ToTable("RunePage");
b.HasData(
new
{
Name = "FirstRunepage"
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkillEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.SkillEntity", b =>
@ -151,28 +196,26 @@ namespace EntityFrameworkLOL.Migrations
.IsRequired() .IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<int>("TypeId") b.Property<int>("Type")
.HasColumnType("INTEGER"); .HasColumnType("INTEGER");
b.HasKey("Name"); b.HasKey("Name");
b.HasIndex("TypeId");
b.ToTable("Skill"); b.ToTable("Skill");
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkillTypeEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("Type")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.ToTable("SkillType"); b.HasData(
new
{
Name = "Beautiful layout",
Description = "Bowl'In",
Type = 3
},
new
{
Name = "DB Support",
Description = "DB",
Type = 1
});
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkinEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.SkinEntity", b =>
@ -188,7 +231,6 @@ namespace EntityFrameworkLOL.Migrations
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<string>("Icon") b.Property<string>("Icon")
.IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<string>("ImageBase64") b.Property<string>("ImageBase64")
@ -204,9 +246,40 @@ namespace EntityFrameworkLOL.Migrations
b.HasIndex("ImageBase64"); b.HasIndex("ImageBase64");
b.ToTable("Skin"); b.ToTable("Skin");
b.HasData(
new
{
Name = "Darker WinKer",
Description = "Be invisible in the darkness but never alone",
Icon = "default",
Price = 9.99f
},
new
{
Name = "Summer Daffodil",
Description = "A jewel of Summer for all year long",
Icon = "default",
Price = 9.99f
});
}); });
modelBuilder.Entity("ChampionEntitySkillEntity", b => modelBuilder.Entity("RuneEntityRunePageEntity", b =>
{
b.Property<string>("RunePagesName")
.HasColumnType("TEXT");
b.Property<string>("RunesName")
.HasColumnType("TEXT");
b.HasKey("RunePagesName", "RunesName");
b.HasIndex("RunesName");
b.ToTable("RuneEntityRunePageEntity");
});
modelBuilder.Entity("ChampionEntityRunePageEntity", b =>
{ {
b.HasOne("EntityFrameworkLOL.Entities.ChampionEntity", null) b.HasOne("EntityFrameworkLOL.Entities.ChampionEntity", null)
.WithMany() .WithMany()
@ -214,58 +287,53 @@ namespace EntityFrameworkLOL.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("EntityFrameworkLOL.Entities.SkillEntity", null) b.HasOne("EntityFrameworkLOL.Entities.RunePageEntity", null)
.WithMany() .WithMany()
.HasForeignKey("SkillsName") .HasForeignKey("RunePagesName")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionEntity", b => modelBuilder.Entity("ChampionEntitySkillEntity", b =>
{ {
b.HasOne("EntityFrameworkLOL.Entities.ChampionClassEntity", "Class") b.HasOne("EntityFrameworkLOL.Entities.ChampionEntity", null)
.WithMany() .WithMany()
.HasForeignKey("ClassId") .HasForeignKey("ChampionsName")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("EntityFrameworkLOL.Entities.ImageEntity", "Image") b.HasOne("EntityFrameworkLOL.Entities.SkillEntity", null)
.WithMany() .WithMany()
.HasForeignKey("ImageBase64") .HasForeignKey("SkillsName")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Class");
b.Navigation("Image");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.ChampionEntity", b =>
{ {
b.HasOne("EntityFrameworkLOL.Entities.RuneFamilyEntity", "Family")
.WithMany()
.HasForeignKey("FamilyId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntityFrameworkLOL.Entities.ImageEntity", "Image") b.HasOne("EntityFrameworkLOL.Entities.ImageEntity", "Image")
.WithMany() .WithMany()
.HasForeignKey("ImageBase64"); .HasForeignKey("ImageBase64");
b.Navigation("Family");
b.Navigation("Image"); b.Navigation("Image");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkillEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.CharacteristicEntity", b =>
{ {
b.HasOne("EntityFrameworkLOL.Entities.SkillTypeEntity", "Type") b.HasOne("EntityFrameworkLOL.Entities.ChampionEntity", "Champion")
.WithMany() .WithMany()
.HasForeignKey("TypeId") .HasForeignKey("ChampionName");
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Type"); b.Navigation("Champion");
});
modelBuilder.Entity("EntityFrameworkLOL.Entities.RuneEntity", b =>
{
b.HasOne("EntityFrameworkLOL.Entities.ImageEntity", "Image")
.WithMany()
.HasForeignKey("ImageBase64");
b.Navigation("Image");
}); });
modelBuilder.Entity("EntityFrameworkLOL.Entities.SkinEntity", b => modelBuilder.Entity("EntityFrameworkLOL.Entities.SkinEntity", b =>
@ -282,6 +350,21 @@ namespace EntityFrameworkLOL.Migrations
b.Navigation("Image"); b.Navigation("Image");
}); });
modelBuilder.Entity("RuneEntityRunePageEntity", b =>
{
b.HasOne("EntityFrameworkLOL.Entities.RunePageEntity", null)
.WithMany()
.HasForeignKey("RunePagesName")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("EntityFrameworkLOL.Entities.RuneEntity", null)
.WithMany()
.HasForeignKey("RunesName")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }
} }

@ -8,100 +8,5 @@ class Program
{ {
static void Main(string[] args) static void Main(string[] args)
{ {
ChampionEntity akali = new ChampionEntity { Name = "Akali", Bio = "" };
ChampionEntity aatrox = new ChampionEntity { Name = "Aatrox", Bio = "" };
ChampionEntity ahri = new ChampionEntity { Name = "Ahri", Bio = "" };
ChampionEntity bard = new ChampionEntity { Name = "Bard", Bio = "" };
ChampionEntity alistar = new ChampionEntity { Name = "Alistar", Bio = "" };
ChampionEntity akshan = new ChampionEntity { Name = "Akshan", Bio = "" };
using (var context = new SQLiteContext())
{
// Crée des champions et les insère dans la base
Console.WriteLine("Creates and inserts new Champions");
context.Add(akali);
context.Add(aatrox);
context.Add(ahri);
context.Add(bard);
context.Add(alistar);
context.Add(akshan);
context.SaveChanges();
Console.WriteLine("Creates and executes a query retrieving the first Champion of the database whose name starts with an \"A\":");
var aChampion = context.Champion
.Where(c => c.Name.StartsWith("A"))
.First();
Console.WriteLine($"{aChampion.Name} (with bio : \"{aChampion.Bio}\")");
}
RuneEntity conqueror = new RuneEntity { Name = "Conqueror", Description = "" };
RuneEntity thriumph = new RuneEntity { Name = "Thriumph", Description = "" };
RuneEntity alacrity = new RuneEntity { Name = "Legend : Alacrity", Description = "" };
RuneEntity tenacity = new RuneEntity { Name = "Legend : Tenacity", Description = "" };
RuneEntity laststand = new RuneEntity { Name = "Last Stand", Description = "" };
RuneEntity laststand2 = new RuneEntity { Name = "Last Stand 2", Description = "" };
using (var context = new SQLiteContext())
{
// Crée des Runes et les insère dans la base
Console.WriteLine("Creates and inserts new Runes");
context.Add(conqueror);
context.Add(thriumph);
context.Add(alacrity);
context.Add(tenacity);
context.Add(laststand);
context.Add(laststand2);
context.SaveChanges();
Console.WriteLine("Creates and executes a query retrieving the first Runes of the database whose name starts with an \"L\":");
var lRune = context.Rune
.Where(r => r.Name.StartsWith("L"))
.First();
Console.WriteLine($"{lRune.Name} (with Description : \"{lRune.Description}\")");
}
SkinEntity stinger = new SkinEntity { Name = "Stinger", Description = "" };
SkinEntity infernal = new SkinEntity { Name = "Infernal", Description = "" };
SkinEntity allStar = new SkinEntity { Name = "All-Star", Description = "" };
SkinEntity justicar = new SkinEntity { Name = "Justicar", Description = "" };
SkinEntity mecha = new SkinEntity { Name = "Mecha", Description = "" };
SkinEntity seaHunter = new SkinEntity { Name = "Sea Hunter", Description = "" };
using (var context = new SQLiteContext())
{
// Crée des Skins et les insère dans la base
Console.WriteLine("Creates and inserts new Skins");
context.Add(stinger);
context.Add(infernal);
context.Add(allStar);
context.Add(justicar);
context.Add(mecha);
context.Add(seaHunter);
context.SaveChanges();
Console.WriteLine("Creates and executes a query retrieving the first Skins of the database whose name starts with an \"I\":");
var iSkin = context.Skin
.Where(s => s.Name.StartsWith("I"))
.First();
Console.WriteLine($"{iSkin.Name} (with Description : \"{iSkin.Description}\")");
Console.WriteLine("Updates the name of the Infernal Skin");
iSkin.Description = "Hella Infernal (Wallah)";
context.SaveChanges();
Console.WriteLine($"{iSkin.Name} (with Description : \"{iSkin.Description}\")");
Console.WriteLine("Deletes one item from the database");
var droid = context.Skin
.SingleOrDefault(s => s.Name.Equals("Infernal"));
context.Remove(droid);
context.SaveChanges();
}
using (var context = new SQLiteContext())
{
foreach (var c in context.Champion)
{
c.Bio = $"{c.Name}";
Console.WriteLine($"{c.Name} - {c.Bio}");
}
context.SaveChanges();
}
} }
} }

@ -21,7 +21,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DTO", "DTO\DTO.csproj", "{1
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EntityFrameworkLOL", "EntityFrameworkLOL\EntityFrameworkLOL.csproj", "{61D807B0-FA1A-439D-9810-9F31A0C47034}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EntityFrameworkLOL", "EntityFrameworkLOL\EntityFrameworkLOL.csproj", "{61D807B0-FA1A-439D-9810-9F31A0C47034}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestUnitaire", "TestUnitaire\TestUnitaire.csproj", "{D24FBC48-F9C3-45CA-8D51-A851559C307F}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestUnitaire", "TestUnitaire\TestUnitaire.csproj", "{D24FBC48-F9C3-45CA-8D51-A851559C307F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ManagersEF", "ManagersEF\ManagersEF.csproj", "{A8685E74-67E4-4382-AF91-38045AC0014B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestEF", "TestEF\TestEF.csproj", "{81CEA57F-3CCB-4CF8-8315-2B5BC403E0FD}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -61,6 +65,14 @@ Global
{D24FBC48-F9C3-45CA-8D51-A851559C307F}.Debug|Any CPU.Build.0 = Debug|Any CPU {D24FBC48-F9C3-45CA-8D51-A851559C307F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D24FBC48-F9C3-45CA-8D51-A851559C307F}.Release|Any CPU.ActiveCfg = Release|Any CPU {D24FBC48-F9C3-45CA-8D51-A851559C307F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D24FBC48-F9C3-45CA-8D51-A851559C307F}.Release|Any CPU.Build.0 = Release|Any CPU {D24FBC48-F9C3-45CA-8D51-A851559C307F}.Release|Any CPU.Build.0 = Release|Any CPU
{A8685E74-67E4-4382-AF91-38045AC0014B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A8685E74-67E4-4382-AF91-38045AC0014B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A8685E74-67E4-4382-AF91-38045AC0014B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A8685E74-67E4-4382-AF91-38045AC0014B}.Release|Any CPU.Build.0 = Release|Any CPU
{81CEA57F-3CCB-4CF8-8315-2B5BC403E0FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{81CEA57F-3CCB-4CF8-8315-2B5BC403E0FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{81CEA57F-3CCB-4CF8-8315-2B5BC403E0FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{81CEA57F-3CCB-4CF8-8315-2B5BC403E0FD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

@ -0,0 +1,147 @@
using Model;
using Shared;
using System.Data.SqlTypes;
using APILOL.Mapper;
using Microsoft.EntityFrameworkCore;
using System.Xml.Linq;
namespace ManagersEF
{
public partial class EFManager
{
public class ChampionsManager : IChampionsManager
{
private readonly EFManager parent;
public ChampionsManager(EFManager parent)
=> this.parent = parent;
public async Task<Champion?> AddItem(Champion? item)
{
await parent.DbContext.Champion.AddAsync(item.ToEntity(parent.DbContext));
parent.DbContext.SaveChanges();
return item;
}
public async Task<bool> DeleteItem(Champion? item)
{
var toDelete = parent.DbContext.Champion.Find(item.Name);
if (toDelete != null)
{
parent.DbContext.Champion.Remove(toDelete);
parent.DbContext.SaveChanges();
return true;
}
return false;
}
public async Task<IEnumerable<Champion?>> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false)
{
Console.WriteLine("GET");
return parent.DbContext.Champion.GetItemsWithFilterAndOrdering(
c => true,
index, count,
orderingPropertyName, descending).Select(c => c.ToModel());
}
public async Task<IEnumerable<Champion?>> GetItemsByCharacteristic(string charName, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Champion.Include("Characteristics").GetItemsWithFilterAndOrdering(
c => c.Characteristics.Any(ch => ch.Name.Equals(charName)),
index, count,
orderingPropertyName, descending).Select(c => c.ToModel());
}
public async Task<IEnumerable<Champion?>> GetItemsByClass(ChampionClass championClass, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Champion.GetItemsWithFilterAndOrdering(
c => c.Class.Equals(championClass),
index, count,
orderingPropertyName, descending).Select(c => c.ToModel());
}
public async Task<IEnumerable<Champion?>> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Champion.GetItemsWithFilterAndOrdering(
c => c.Name.Contains(substring),
index, count,
orderingPropertyName, descending).Select(c => c.ToModel());
}
public async Task<IEnumerable<Champion?>> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Champion.Include("runepages").GetItemsWithFilterAndOrdering(
c => c.RunePages.Any(rp => rp.Equals(runePage.ToEntity(parent.DbContext))),
index, count,
orderingPropertyName, descending).Select(c => c.ToModel());
}
public async Task<IEnumerable<Champion?>> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Champion.GetItemsWithFilterAndOrdering(
c => skill != null && c.Skills.Any(s => s.Name.Equals(skill.Name)),
index, count,
orderingPropertyName, descending).Select(c => c.ToModel());
}
public async Task<IEnumerable<Champion?>> GetItemsBySkill(string skill, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Champion.Include("Skills").GetItemsWithFilterAndOrdering(
c => skill != null && c.Skills.Any(s => s.Name.Equals(skill)),
index, count,
orderingPropertyName, descending).Select(c => c.ToModel());
}
public async Task<int> GetNbItems()
{
return parent.DbContext.Champion.Count();
}
public async Task<int> GetNbItemsByCharacteristic(string charName)
{
return parent.DbContext.Champion.Where(c => c.Characteristics.Any(ch => ch.Name.Equals(charName))).Count();
}
public async Task<int> GetNbItemsByClass(ChampionClass championClass)
{
return parent.DbContext.Champion.Where(c => c.Class.Equals(championClass))
.Count();
}
public async Task<int> GetNbItemsByName(string substring)
{
return parent.DbContext.Champion.Where(c => c.Name.Contains(substring))
.Count();
}
public async Task<int> GetNbItemsByRunePage(RunePage? runePage)
{
return parent.DbContext.Champion.Where(c => c.RunePages.Any(rp => rp.Equals(runePage.ToEntity(parent.DbContext)))).Count();
}
public async Task<int> GetNbItemsBySkill(Skill? skill)
{
return parent.DbContext.Champion.Where(c => skill != null && c.Skills.Any(s => s.Name.Equals(skill.Name)))
.Count();
}
public async Task<int> GetNbItemsBySkill(string skill)
{
return parent.DbContext.Champion.Where(c => skill != null && c.Skills.Any(s => s.Name.Equals(skill)))
.Count();
}
public async Task<Champion?> UpdateItem(Champion? oldItem, Champion? newItem)
{
var toUpdate = parent.DbContext.Champion.Find(oldItem.Name);
toUpdate = newItem.ToEntity(parent.DbContext);
parent.DbContext.SaveChanges();
return newItem;
}
}
}
}

@ -0,0 +1,115 @@
using APILOL.Mapper;
using EntityFrameworkLOL.Entities;
using ManagersEF;
using Microsoft.EntityFrameworkCore;
using Model;
using System.Data.SqlTypes;
using System.Linq;
using System.Xml.Linq;
namespace ManagersEF
{
public partial class EFManager
{
public class RunePagesManager : IRunePagesManager
{
private readonly EFManager parent;
public RunePagesManager(EFManager parent)
=> this.parent = parent;
public async Task<RunePage?> AddItem(RunePage? item)
{
await parent.DbContext.RunePage.AddAsync(item.ToEntity(parent.DbContext));
parent.DbContext.SaveChanges();
return item;
}
public async Task<bool> DeleteItem(RunePage? item)
{
var toDelete = parent.DbContext.RunePage.Find(item.Name);
if (toDelete != null)
{
parent.DbContext.RunePage.Remove(toDelete);
parent.DbContext.SaveChanges();
return true;
}
return false;
}
public async Task<IEnumerable<RunePage?>> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.RunePage.GetItemsWithFilterAndOrdering(
rp => true,
index, count,
orderingPropertyName, descending).Select(rp => rp.ToModel(parent.DbContext));
}
public async Task<IEnumerable<RunePage?>> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.RunePage.Include("champions").GetItemsWithFilterAndOrdering(
rp => rp.Champions.Any(c => c.Name.Equals(champion.Name)),
index, count,
orderingPropertyName, descending).Select(rp => rp.ToModel(parent.DbContext));
}
public async Task<IEnumerable<RunePage?>> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.RunePage.GetItemsWithFilterAndOrdering(
rp => rp.Name.Contains(substring),
index, count,
orderingPropertyName, descending).Select(rp => rp.ToModel(parent.DbContext));
}
public async Task<IEnumerable<RunePage?>> GetItemsByRune(Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.RunePage.Include("entries").GetItemsWithFilterAndOrdering(
rp => rp.entries.Any(r => r.RuneName.Equals(rune.Name)),
index, count,
orderingPropertyName, descending).Select(rp => rp.ToModel(parent.DbContext));
}
public async Task<int> GetNbItems()
{
return parent.DbContext.RunePage.Count();
}
public async Task<int> GetNbItemsByChampion(Champion? champion)
{
return parent.DbContext.RunePage.Where(rp => rp.champions.Any(c => c.Name.Equals(champion.Name))).Count();
}
public async Task<int> GetNbItemsByName(string substring)
{
return parent.DbContext.RunePage.Where(rp => rp.Name.Contains(substring)).Count();
}
public async Task<int> GetNbItemsByRune(Model.Rune? rune)
{
return parent.DbContext.RunePage.Where(rp => rp.entries.Any(r => r.RuneName.Equals(rune.Name))).Count();
}
public async Task<RunePage?> UpdateItem(RunePage? oldItem, RunePage? newItem)
{
var toUpdate = parent.DbContext.RunePage.Include("entries")
.Where(x => x.Name.Equals(newItem.Name)).First();
try
{
toUpdate.entries = newItem.Runes.Select(r => new RunePageRuneEntity()
{
category = r.Key,
rune = r.Value.ToEntity(parent.DbContext),
}).ToList();
parent.DbContext.SaveChanges();
}
catch (DbUpdateException) { }
return newItem;
}
}
}
}

@ -0,0 +1,85 @@
using APILOL.Mapper;
using Microsoft.EntityFrameworkCore;
using Model;
using Shared;
using System.Xml.Linq;
namespace ManagersEF
{
public partial class EFManager
{
public class RunesManager : IRunesManager
{
private readonly EFManager parent;
public RunesManager(EFManager parent)
=> this.parent = parent;
public async Task<Rune?> AddItem(Rune? item)
{
await parent.DbContext.Rune.AddAsync(item.ToEntity(parent.DbContext));
parent.DbContext.SaveChanges();
return item;
}
public async Task<bool> DeleteItem(Rune? item)
{
var toDelete = parent.DbContext.Rune.Find(item?.Name);
if (toDelete != null)
{
parent.DbContext.Rune.Remove(item?.ToEntity(parent.DbContext));
parent.DbContext.SaveChanges();
return true;
}
return false;
}
public async Task<IEnumerable<Rune?>> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Rune.GetItemsWithFilterAndOrdering(
r => true,
index, count,
orderingPropertyName, descending).Select(r => r.ToModel());
}
public async Task<IEnumerable<Rune?>> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Rune.GetItemsWithFilterAndOrdering(
r => r.Family.Equals(family),
index, count,
orderingPropertyName, descending).Select(r => r.ToModel());
}
public async Task<IEnumerable<Rune?>> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Rune.GetItemsWithFilterAndOrdering(
r => r.Name.Contains(substring),
index, count,
orderingPropertyName, descending).Select(r => r.ToModel());
}
public async Task<int> GetNbItems()
{
return parent.DbContext.Rune.Count();
}
public async Task<int> GetNbItemsByFamily(RuneFamily family)
{
return parent.DbContext.Rune.Where(r => r.Family.Equals(family)).Count();
}
public async Task<int> GetNbItemsByName(string substring)
{
return parent.DbContext.Rune.Where(r => r.Name.Contains(substring)).Count();
}
public async Task<Rune?> UpdateItem(Rune? oldItem, Rune? newItem)
{
var toUpdate = parent.DbContext.Rune.Find(oldItem.Name);
toUpdate.Description = newItem.Description;
toUpdate.Family = newItem.Family;
parent.DbContext.SaveChanges();
return newItem;
}
}
}
}

@ -0,0 +1,90 @@
using APILOL.Mapper;
using Microsoft.EntityFrameworkCore;
using Model;
using System.Data.SqlTypes;
using System.Xml.Linq;
namespace ManagersEF
{
public partial class EFManager
{
public class SkinsManager : ISkinsManager
{
private readonly EFManager parent;
public SkinsManager(EFManager parent)
=> this.parent = parent;
public async Task<Skin?> AddItem(Skin? item)
{
await parent.DbContext.Skin.AddAsync(item.ToEntity(parent.DbContext));
parent.DbContext.SaveChanges();
return item;
}
public async Task<bool> DeleteItem(Skin? item)
{
var toDelete = parent.DbContext.Skin.Find(item.Name);
if (toDelete != null)
{
parent.DbContext.Skin.Remove(toDelete);
parent.DbContext.SaveChanges();
return true;
}
return false;
}
public async Task<IEnumerable<Skin?>> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Skin.Include("Champion").GetItemsWithFilterAndOrdering(
s => true,
index, count,
orderingPropertyName, descending).Select(s => s?.ToModel());
}
public async Task<IEnumerable<Skin?>> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Skin.Include("Champion").GetItemsWithFilterAndOrdering(
s => s.ChampionSkin.Name.Equals(champion?.Name),
index, count,
orderingPropertyName, descending).Select(s => s?.ToModel());
}
public async Task<IEnumerable<Skin?>> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
return parent.DbContext.Skin.Include("Champion").GetItemsWithFilterAndOrdering(
s => s.Name.Contains(substring),
index, count,
orderingPropertyName, descending).Select(s => s?.ToModel());
}
public async Task<int> GetNbItems()
{
return parent.DbContext.Skin.Count();
}
public async Task<int> GetNbItemsByChampion(Champion? champion)
{
if (champion != null)
{
return parent.DbContext.Skin.Where(s => s.ChampionSkin.Name.Equals(champion.Name))
.Count();
}
return 0;
}
public async Task<int> GetNbItemsByName(string substring)
{
return parent.DbContext.Skin.Where(s => s.Name.Contains(substring))
.Count();
}
public async Task<Skin?> UpdateItem(Skin? oldItem, Skin? newItem)
{
var toUpdate = parent.DbContext.Skin.Find(oldItem.Name);
toUpdate.ChampionSkin = parent.DbContext.Champion.Find(newItem.Champion.Name);
return newItem;
}
}
}
}

@ -0,0 +1,28 @@
using Microsoft.EntityFrameworkCore;
using Model;
using EntityFrameworkLOL.DBContexts;
namespace ManagersEF
{
public partial class EFManager : IDataManager
{
public EFManager(SQLiteContext dbContext)
{
DbContext = dbContext;
ChampionsMgr = new ChampionsManager(this);
SkinsMgr = new SkinsManager(this);
RunesMgr = new RunesManager(this);
RunePagesMgr = new RunePagesManager(this);
}
protected SQLiteContext DbContext { get; }
public IChampionsManager ChampionsMgr { get; }
public ISkinsManager SkinsMgr { get; }
public IRunesManager RunesMgr { get; }
public IRunePagesManager RunePagesMgr { get; }
}
}

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ManagersEF
{
static class Extensions
{
internal static IEnumerable<T?> GetItemsWithFilterAndOrdering<T>(this IEnumerable<T> collection,
Func<T, bool> filter, int index, int count, string? orderingPropertyName = null, bool descending = false)
{
IEnumerable<T> temp = collection;
temp = temp.Where(item => filter(item));
if (orderingPropertyName != null)
{
var prop = typeof(T).GetProperty(orderingPropertyName!);
if (prop != null)
{
temp = descending ? temp.OrderByDescending(item => prop.GetValue(item))
: temp.OrderBy(item => prop.GetValue(item));
}
}
return temp.Skip(index * count).Take(count);
}
}
}

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\EntityFrameworkLOL\EntityFrameworkLOL.csproj" />
<ProjectReference Include="..\APILOL\APILOL.csproj" />
</ItemGroup>
</Project>

@ -20,6 +20,8 @@
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" /> <ProjectReference Include="..\Shared\Shared.csproj" />

@ -14,6 +14,8 @@
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -14,6 +14,8 @@
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -0,0 +1,189 @@
using EntityFrameworkLOL.Entities;
using EntityFrameworkLOL.DBContexts;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Model;
using Shared;
using System.Xml.Linq;
using Xunit.Abstractions;
using Xunit;
using ManagersEF;
namespace TestEF
{
public class TestChampions
{
[Fact]
public async void Test_Add()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
Champion batman = new("Batman", ChampionClass.Assassin, "icon_1", "image_1", "L'ombre de la nuit");
batman.AddSkill(new("Bat-signal", SkillType.Basic, "Envoie le signal"));
batman.AddCharacteristics(new[] {
Tuple.Create("Force", 150),
Tuple.Create("Agilité", 500)
});
Champion endeavor = new("Endeavor", ChampionClass.Tank, "icon_2", "image_2", "Feu brûlant énernel");
endeavor.AddSkill(new("Final flames", SkillType.Ultimate, "Dernière flamme d'un héro"));
endeavor.AddCharacteristics(new[] {
Tuple.Create("Force", 200),
Tuple.Create("Défense", 300),
Tuple.Create("Alter", 800)
});
Champion escanor = new("Escanor", ChampionClass.Fighter, "icon_3", "image_3", "1, 2, 3, Soleil");
escanor.AddSkill(new("Croissance solaire", SkillType.Passive, "Le soleil rends plus fort !"));
escanor.AddCharacteristics(new[] {
Tuple.Create("Force", 500),
Tuple.Create("Défense", 500)
});
await manager.AddItem(batman);
await manager.AddItem(endeavor);
await manager.AddItem(escanor);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
var nbItems = await manager.GetNbItems();
Assert.Equal(3, nbItems);
var items = await manager.GetItemsByName("Batman", 0, nbItems);
Assert.Equal("Batman", items.First().Name);
Assert.Equal(2, await manager.GetNbItemsByName("E"));
items = await manager.GetItemsBySkill("Croissance solaire", 0, nbItems);
Assert.Equal("Escanor", items.First().Name);
items = await manager.GetItemsBySkill(new Skill("Final flames", SkillType.Ultimate, "Dernière flamme d'un héro"),
0, nbItems);
Assert.Equal("Endeavor", items.First().Name);
items = await manager.GetItemsByCharacteristic("Alter", 0, nbItems);
Assert.Equal("Endeavor", items.First().Name);
Assert.Equal(2, await manager.GetNbItemsByCharacteristic("Défense"));
}
}
[Fact]
public async void Test_Update()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
Champion batman = new("Batman", ChampionClass.Assassin, "icon_1", "image_1", "L'ombre de la nuit");
Champion endeavor = new("Endeavor", ChampionClass.Tank, "icon_2", "image_2", "Feu brûlant énernel");
Champion escanor = new("Escanor", ChampionClass.Fighter, "icon_3", "image_3", "1, 2, 3, Soleil");
await manager.AddItem(batman);
await manager.AddItem(endeavor);
await manager.AddItem(escanor);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
var items = await manager.GetItemsByName("E", 0, 3);
Assert.Equal(2, items.Count());
var escanor = context.Champion.Where(n => n.Name.Contains("Esc")).First();
escanor.Class = ChampionClass.Tank;
context.SaveChanges();
items = await manager.GetItemsByClass(ChampionClass.Tank, 0, 3);
Assert.Contains("Escanor", items.Select(x => x.Name));
Assert.Equal(2, await manager.GetNbItemsByClass(ChampionClass.Tank));
}
}
[Fact]
public async void Test_Delete()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
Champion batman = new("Batman", ChampionClass.Assassin, "icon_1", "image_1", "L'ombre de la nuit");
batman.AddSkill(new("Charge", SkillType.Basic, "Coup de base"));
batman.AddSkill(new("Double Saut", SkillType.Basic, ""));
Champion endeavor = new("Endeavor", ChampionClass.Tank, "icon_2", "image_2", "Feu brûlant énernel");
endeavor.AddSkill(new("Charge", SkillType.Basic, "Coup de base"));
Champion escanor = new("Escanor", ChampionClass.Fighter, "icon_3", "image_3", "1, 2, 3, Soleil");
escanor.AddSkill(new("Charge", SkillType.Basic, "Coup de base"));
batman.AddSkill(new("Double Saut", SkillType.Basic, ""));
await manager.AddItem(batman);
await manager.AddItem(endeavor);
await manager.AddItem(escanor);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
var endeavor = (await manager.GetItemsByName("Endeavor", 0, 3)).First();
var itemsByName = await manager.DeleteItem(endeavor);
Assert.Equal(2, await manager.GetNbItems());
var items = await manager.GetItems(0, await manager.GetNbItems());
Assert.DoesNotContain("Endeavor", items.Select(x => x.Name));
Assert.Equal(1, await manager.GetNbItemsBySkill(new Skill("Double Saut", SkillType.Basic, "")));
Assert.Equal(2, await manager.GetNbItemsBySkill("Charge"));
}
}
}
}

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="7.0.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
<ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\EntityFrameworkLOL\EntityFrameworkLOL.csproj" />
<ProjectReference Include="..\APILOL\APILOL.csproj" />
<ProjectReference Include="..\ManagersEF\ManagersEF.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,277 @@
using ManagersEF;
using EntityFrameworkLOL.Entities;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Model;
using Shared;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Model.RunePage;
using System.Xml.Linq;
using Xunit;
using EntityFrameworkLOL.DBContexts;
namespace TestEF
{
public class TestRunePages
{
[Fact]
public async void Test_Add()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunePagesMgr;
var runeManager = new EFManager(context).RunesMgr;
var championManager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
Model.Rune rune1 = new("Sanglante", RuneFamily.Domination);
Model.Rune rune2 = new("Oeil de l'esprit", RuneFamily.Precision);
Model.Rune rune3 = new("Concrétisation", RuneFamily.Unknown);
Model.Rune rune4 = new("The moon", RuneFamily.Unknown);
Model.Rune rune5 = new("Radiance", RuneFamily.Domination);
Model.Rune rune6 = new("Bullseye", RuneFamily.Precision);
RunePage runepage1 = new("Damages");
runepage1[Category.Major] = rune1;
runepage1[Category.Minor1] = rune2;
runepage1[Category.Minor2] = rune5;
RunePage runepage2 = new("Hawk");
runepage2[Category.Major] = rune6;
runepage2[Category.Minor1] = rune2;
RunePage runepage3 = new("Juggler");
runepage3[Category.Major] = rune5;
runepage3[Category.Minor1] = rune3;
runepage3[Category.Minor2] = rune2;
await runeManager.AddItem(rune1);
await runeManager.AddItem(rune2);
await runeManager.AddItem(rune3);
await runeManager.AddItem(rune4);
await runeManager.AddItem(rune5);
await runeManager.AddItem(rune6);
await manager.AddItem(runepage1);
await manager.AddItem(runepage2);
await manager.AddItem(runepage3);
Champion batman = new("Batman", ChampionClass.Assassin, "icon_1", "image_1", "L'ombre de la nuit");
Champion endeavor = new("Endeavor", ChampionClass.Tank, "icon_2", "image_2", "Feu brûlant énernel");
Champion escanor = new("Escanor", ChampionClass.Fighter, "icon_3", "image_3", "1, 2, 3, Soleil");
await championManager.AddItem(batman);
await championManager.AddItem(endeavor);
await championManager.AddItem(escanor);
var runepage_entities = context.RunePage;
var champion_entities = context.Champion;
var damages = runepage_entities.Find("Damages");
var hawk = runepage_entities.Find("Hawk");
var juggler = runepage_entities.Find("Juggler");
champion_entities.Find("Batman")!.RunePages = new List<RunePageEntity>() { hawk, juggler };
champion_entities.Find("Endeavor")!.RunePages = new List<RunePageEntity>() { damages };
champion_entities.Find("Escanor")!.RunePages = new List<RunePageEntity>() { damages };
context.SaveChanges();
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunePagesMgr;
var championManager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
Model.Rune rune5 = new("Radiance", RuneFamily.Domination);
Model.Rune rune1 = new("Sanglante", RuneFamily.Domination);
Champion batman = new("Batman", ChampionClass.Assassin, "icon_1", "image_1", "L'ombre de la nuit");
Champion endeavor = new("Endeavor", ChampionClass.Tank, "icon_2", "image_2", "Feu brûlant énernel");
var nbItems = await manager.GetNbItems();
Assert.Equal(3, nbItems);
var items = await manager.GetItemsByName("Ha", 0, nbItems);
Assert.Equal("Hawk", items.First().Name);
Assert.Equal(2, await manager.GetNbItemsByName("a"));
Assert.Equal(1, await manager.GetNbItemsByRune(rune5));
items = await manager.GetItemsByRune(rune1, 0, nbItems);
Assert.Equal("Damages", items.First().Name);
Assert.Equal(2, await manager.GetNbItemsByChampion(batman));
Assert.Equal("Damages", (await manager.GetItemsByChampion(endeavor, 0, 3)).First()!.Name);
Assert.Equal(2, await championManager.GetNbItemsByRunePage(new("Damages")));
Assert.Equal("Batman", (await championManager.GetItemsByRunePage(new("Juggler"), 0, 3)).First()!.Name);
}
}
[Fact]
public async void Test_Update()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunePagesMgr;
var runeManager = new EFManager(context).RunesMgr;
context.Database.EnsureCreated();
Model.Rune rune1 = new("Sanglante", RuneFamily.Domination);
Model.Rune rune2 = new("Oeil de l'esprit", RuneFamily.Precision);
Model.Rune rune3 = new("Concrétisation", RuneFamily.Unknown);
Model.Rune rune4 = new("The moon", RuneFamily.Unknown);
Model.Rune rune5 = new("Radiance", RuneFamily.Domination);
Model.Rune rune6 = new("Bullseye", RuneFamily.Precision);
RunePage runepage1 = new("Damages");
runepage1[Category.Major] = rune1;
runepage1[Category.Minor1] = rune2;
runepage1[Category.Minor2] = rune5;
RunePage runepage2 = new("Hawk");
runepage2[Category.Major] = rune6;
runepage2[Category.Minor1] = rune2;
RunePage runepage3 = new("Juggler");
runepage3[Category.Major] = rune5;
runepage3[Category.Minor1] = rune3;
runepage3[Category.Minor2] = rune2;
await runeManager.AddItem(rune1);
await runeManager.AddItem(rune2);
await runeManager.AddItem(rune3);
await runeManager.AddItem(rune4);
await runeManager.AddItem(rune5);
await runeManager.AddItem(rune6);
await manager.AddItem(runepage1);
await manager.AddItem(runepage2);
await manager.AddItem(runepage3);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunePagesMgr;
Model.Rune rune1 = new("Sanglante", RuneFamily.Domination);
Model.Rune rune6 = new("Bullseye", RuneFamily.Precision);
context.Database.EnsureCreated();
Assert.Equal(1, await manager.GetNbItemsByRune(rune1));
Assert.Equal(1, await manager.GetNbItemsByRune(rune6));
RunePage after = new("Hawk");
after[Category.Major] = rune1;
await manager.UpdateItem(new("Hawk"), after);
Assert.Equal(2, await manager.GetNbItemsByRune(rune1));
Assert.Equal(0, await manager.GetNbItemsByRune(rune6));
context.SaveChanges();
}
}
[Fact]
public async void Test_Delete()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunePagesMgr;
var runeManager = new EFManager(context).RunesMgr;
context.Database.EnsureCreated();
Model.Rune rune1 = new("Sanglante", RuneFamily.Domination);
Model.Rune rune2 = new("Oeil de l'esprit", RuneFamily.Precision);
Model.Rune rune3 = new("Concrétisation", RuneFamily.Unknown);
Model.Rune rune4 = new("The moon", RuneFamily.Unknown);
Model.Rune rune5 = new("Radiance", RuneFamily.Domination);
Model.Rune rune6 = new("Bullseye", RuneFamily.Precision);
RunePage runepage1 = new("Damages");
runepage1[Category.Major] = rune1;
runepage1[Category.Minor1] = rune2;
runepage1[Category.Minor2] = rune5;
RunePage runepage2 = new("Hawk");
runepage2[Category.Major] = rune6;
runepage2[Category.Minor1] = rune2;
RunePage runepage3 = new("Juggler");
runepage3[Category.Major] = rune5;
runepage3[Category.Minor1] = rune3;
runepage3[Category.Minor2] = rune2;
await runeManager.AddItem(rune1);
await runeManager.AddItem(rune2);
await runeManager.AddItem(rune3);
await runeManager.AddItem(rune4);
await runeManager.AddItem(rune5);
await runeManager.AddItem(rune6);
await manager.AddItem(runepage1);
await manager.AddItem(runepage2);
await manager.AddItem(runepage3);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunePagesMgr;
Model.Rune rune2 = new("Oeil de l'esprit", RuneFamily.Precision);
context.Database.EnsureCreated();
Assert.Equal(3, await manager.GetNbItems());
await manager.DeleteItem(new("Juggler"));
Assert.Equal(2, await manager.GetNbItems());
Assert.Equal(1, await manager.GetNbItemsByName("e"));
Assert.Equal(1, await manager.GetNbItemsByRune(rune2));
}
}
}
}

@ -0,0 +1,154 @@
using ManagersEF;
using EntityFrameworkLOL.Entities;
using EntityFrameworkLOL.DBContexts;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Model;
using Shared;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Xunit;
namespace TestEF
{
public class TestRunes
{
[Fact]
public async void Test_Add()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunesMgr;
context.Database.EnsureCreated();
Model.Rune rune1 = new("Sanglante", RuneFamily.Domination);
Model.Rune rune2 = new("Oeil de l'esprit", RuneFamily.Precision);
Model.Rune rune3 = new("Concrétisation", RuneFamily.Unknown);
await manager.AddItem(rune1);
await manager.AddItem(rune2);
await manager.AddItem(rune3);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunesMgr;
context.Database.EnsureCreated();
var nbItems = await manager.GetNbItems();
Assert.Equal(3, nbItems);
var items = await manager.GetItemsByName("Sanglante", 0, nbItems);
Assert.Equal("Sanglante", items.First().Name);
Assert.Equal(1, await manager.GetNbItemsByName("Concrétisation"));
items = await manager.GetItemsByFamily(RuneFamily.Precision, 0, nbItems);
Assert.Equal("Oeil de l'esprit", items.First().Name);
Assert.Equal(1, await manager.GetNbItemsByFamily(RuneFamily.Unknown));
}
}
[Fact]
public async void Test_Update()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunesMgr;
context.Database.EnsureCreated();
Model.Rune rune1 = new("Sanglante", RuneFamily.Domination);
Model.Rune rune2 = new("Oeil de l'esprit", RuneFamily.Precision);
Model.Rune rune3 = new("Concrétisation", RuneFamily.Unknown);
await manager.AddItem(rune1);
await manager.AddItem(rune2);
await manager.AddItem(rune3);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunesMgr;
context.Database.EnsureCreated();
Assert.Equal(1, await manager.GetNbItemsByFamily(RuneFamily.Precision));
Model.Rune before = new("Concrétisation", RuneFamily.Unknown);
Model.Rune after = new("Concrétisation", RuneFamily.Precision);
await manager.UpdateItem(before, after);
Assert.Equal(2, await manager.GetNbItemsByFamily(RuneFamily.Precision));
context.SaveChanges();
}
}
[Fact]
public async void Test_Delete()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunesMgr;
context.Database.EnsureCreated();
Model.Rune rune1 = new("Sanglante", RuneFamily.Domination);
Model.Rune rune2 = new("Oeil de l'esprit", RuneFamily.Precision);
Model.Rune rune3 = new("Concrétisation", RuneFamily.Unknown);
await manager.AddItem(rune1);
await manager.AddItem(rune2);
await manager.AddItem(rune3);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).RunesMgr;
context.Database.EnsureCreated();
Assert.Equal(3, await manager.GetNbItems());
await manager.DeleteItem(new("Concrétisation", RuneFamily.Unknown));
Assert.Equal(2, await manager.GetNbItems());
Assert.Equal(0, await manager.GetNbItemsByName("Concrétisation"));
}
}
}
}

@ -0,0 +1,182 @@
using ManagersEF;
using EntityFrameworkLOL.Entities;
using EntityFrameworkLOL.DBContexts;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Model;
using Shared;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Xunit;
namespace TestEF
{
public class TestSkins
{
[Fact]
public async void Test_Add()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).SkinsMgr;
var championManager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
Champion batman = new("Batman", ChampionClass.Assassin);
Champion endeavor = new("Endeavor", ChampionClass.Tank);
await championManager.AddItem(batman);
await championManager.AddItem(endeavor);
Skin batman_skin_1 = new("Batman de glace", batman);
Skin batman_skin_2 = new("Batman gold", batman);
Skin batman_skin_3 = new("L'homme araignée", batman);
Skin endeavor_skin_1 = new("L'abominable Endeavor", endeavor);
await manager.AddItem(batman_skin_1);
await manager.AddItem(batman_skin_2);
await manager.AddItem(batman_skin_3);
await manager.AddItem(endeavor_skin_1);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).SkinsMgr;
context.Database.EnsureCreated();
var nbItems = await manager.GetNbItems();
Assert.Equal(4, nbItems);
Assert.Equal(4, (await manager.GetItems(0, nbItems)).Count());
var items = await manager.GetItemsByName("Batman", 0, nbItems);
Assert.Equal(2, items.Count());
Champion batman = new("Batman", ChampionClass.Assassin);
items = await manager.GetItemsByChampion(batman, 0, nbItems);
Assert.Equal(3, items.Count());
}
}
[Fact]
public async void Test_Update()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).SkinsMgr;
var championManager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
Champion batman = new("Batman", ChampionClass.Assassin);
Champion endeavor = new("Endeavor", ChampionClass.Tank);
await championManager.AddItem(batman);
await championManager.AddItem(endeavor);
Skin batman_skin_1 = new("Batman de glace", batman);
Skin batman_skin_2 = new("Batman gold", batman);
Skin batman_skin_3 = new("L'homme araignée", batman);
Skin endeavor_skin_1 = new("L'abominable Endeavor", endeavor);
await manager.AddItem(batman_skin_1);
await manager.AddItem(batman_skin_2);
await manager.AddItem(batman_skin_3);
await manager.AddItem(endeavor_skin_1);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).SkinsMgr;
context.Database.EnsureCreated();
Champion batman = new("Batman", ChampionClass.Assassin);
Champion endeavor = new("Endeavor", ChampionClass.Tank);
var itemsByName = await manager.GetItemsByChampion(batman, 0, 4);
Assert.Equal(3, itemsByName.Count());
Skin batman_skin = new("L'homme araignée", batman);
Skin endeavor_skin = new("L'homme araignée", endeavor);
await manager.UpdateItem(batman_skin, endeavor_skin);
itemsByName = await manager.GetItemsByChampion(batman, 0, 4);
Assert.Equal(2, itemsByName.Count());
context.SaveChanges();
}
}
[Fact]
public async void Test_Delete()
{
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<SQLiteContext>()
.UseSqlite(connection)
.Options;
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).SkinsMgr;
var championManager = new EFManager(context).ChampionsMgr;
context.Database.EnsureCreated();
Champion batman = new("Batman", ChampionClass.Assassin);
Champion endeavor = new("Endeavor", ChampionClass.Tank);
await championManager.AddItem(batman);
await championManager.AddItem(endeavor);
Skin batman_skin_1 = new("Batman de glace", batman);
Skin batman_skin_2 = new("Batman gold", batman);
Skin batman_skin_3 = new("L'homme araignée", batman);
Skin endeavor_skin_1 = new("L'abominable Endeavor", endeavor);
await manager.AddItem(batman_skin_1);
await manager.AddItem(batman_skin_2);
await manager.AddItem(batman_skin_3);
await manager.AddItem(endeavor_skin_1);
}
using (var context = new SQLiteContext(options))
{
var manager = new EFManager(context).SkinsMgr;
context.Database.EnsureCreated();
await manager.DeleteItem((await manager.GetItemsByName("L'", 0, 4)).First());
await manager.DeleteItem((await manager.GetItemsByName("L'", 0, 3)).First());
Assert.Equal(2, await manager.GetNbItems());
Assert.Equal(2, await manager.GetNbItemsByName("Batman"));
Champion batman = new("Batman", ChampionClass.Assassin);
Assert.Equal(2, await manager.GetNbItemsByChampion(batman));
}
}
}
}

@ -14,6 +14,8 @@
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" /> <PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" /> <PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
<PackageReference Include="coverlet.collector" Version="3.1.2" /> <PackageReference Include="coverlet.collector" Version="3.1.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -27,7 +27,6 @@ namespace TestUnitaire
[TestMethod] [TestMethod]
public async Task TestGet() public async Task TestGet()
{ {
//Act
var champions = await controller.Get(new PageRequest()); var champions = await controller.Get(new PageRequest());
//Assert //Assert

@ -23,5 +23,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -0,0 +1,33 @@
using Microsoft.AspNetCore.Mvc;
namespace TestsEF.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}

@ -0,0 +1,25 @@
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

@ -0,0 +1,31 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:59431",
"sslPort": 44385
}
},
"profiles": {
"TestsEF": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7027;http://localhost:5041",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>
</Project>

@ -0,0 +1,13 @@
namespace TestsEF
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}
}

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Loading…
Cancel
Save