From 8c5a9d7b49889670d27a227cc93ca3192b08db0e Mon Sep 17 00:00:00 2001 From: Emre Date: Sun, 26 Mar 2023 14:50:52 +0200 Subject: [PATCH 1/4] Update README :zap: --- README.md | 8 ++++++++ doc/Images/HowToLaunch.png | Bin 0 -> 65572 bytes 2 files changed, 8 insertions(+) create mode 100644 doc/Images/HowToLaunch.png diff --git a/README.md b/README.md index 071879a..b1a753d 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,14 @@ réalisez à nouveau la migration (ou mettez à jour celle actuelle), puis suppr Si vous préférez éviter la manipulation de l'API, vous pouvez également utiliser le **client MAUI**. Celui-ci contacte directement l'ApiManager, qui se charge des requêtes HTTP à l'API, et vous permet de visualiser et de modifier les données grâce à une interface graphique. +Pour accomplir cela, veuillez configurer les propriétés de la solution en cliquant avec le bouton droit de la souris sur la solution, puis en sélectionnant "propriétés". De cette façon, vous pourrez lancer à la fois l'API et l'application League of Legends. Assurez-vous d'avoir les mêmes configurations : + +
+ +![HowToLaunch](doc/Images/HowToLaunch.png) + +
+ Page **Home**:
diff --git a/doc/Images/HowToLaunch.png b/doc/Images/HowToLaunch.png new file mode 100644 index 0000000000000000000000000000000000000000..b1db5b6749fd601efbc9abf4abeb130c7226a6c6 GIT binary patch literal 65572 zcmcG0byQVb_x7RlAl=g4-Q7r|bV?&3-5^Le5`vV32-4l%-Q6wH-SOLaulK(9`~Mr9 zF*swh_g*#EoX_*jxd>HOlm;W>BZ5F6u&j)PDhLDx27w?6;9-F)KkyvJfnN}gs?uVh z;$gyHAP@;iRzmcRoBnJ5L(BO7=R*h|K!eZ2_5WNoLd&pNy(WP` z|KCrDtZ$YdRKR~8mjNyr|M!hDB=(THmNKa?9b-WVG5>r-^ieY`dc$qa$YuZce&A+I zaA<|G;(wazMFOt6j}2K<{LdSF2_P>nE^vA5NIIXoI1O7tZ{EDg$jE3_xUBq+5Gdw$ zP&H$>9!fnweRsQ8vhgiW@gs3hc^4{}-pei`J?9==XrV%cQYRTps6X^~O9Q`R<3;=5P1H(^$!sjRlBws)z*~-a7m} zHh5gW-Q9N~Pp{-v zDr=$E@!Y7pP4*`t0ttUA)OWUA(0;ZJvV~f_Ie)d4X>t52{_m#B{aXvQDp>5-C9G#l zA*fUB#0(?VB|ox^TV9ZUfu&%;SJ%Z8>&!Og#jjHOR*&?GR{x`2TT-BHPB?k7ghST1 zB`9QWTpLxj{0DU74g;M8GuoTQgdb#M)B*#{?dzmLdb>Ew{DHJd!YwJ=pN-2^s(R#j zyYk*F$z{zm9?};Z7(4smZLmYX*IF`V@U}c8a7O>dvDSpgnO0~MFjvJuw5PSCtesz{ zAX#@N5qXP?p`%mmd&NpQJcSpuVIz9Qqu9^^mOr;jlI#n zW_tKf&M(~PXMfwhhzLA`ZY^q}fe$Z{`zBfhJ|`WCI&aEbc(_mP!+NxHu(jCW;X~PJ z1e4Aov2EJG!_RNO*cH{H=h}RUz~LVe$t&j}g(|)X}6=! zu&R)?!yH5&<3-6xv?@WS9-YE!{0n4nL{$QbuChFOR9g*vqe#j`uHXgcfKUu$$Cae? zjUtV1cl|hTN><^&HzKsZ$U?P^{a#TGEZgU{DCHnYe|&fwgcwd3mtE2EB%3cJv~h&? z%#HmS+-mZO)bBsF1TQ7pZdlb=j&Ehj8&8R=V+el1G)STk4{Qk8N*~gA+f$iklIt+Z zmp1=kxLXvg3D%E`q8ys)?CrW; zxF>u;{M{B-gC{n&xl)UomZ&L6wU}T<8?=#_pXQxxkA=ouitbS(RxHbBl^_3hT(MLn zE>zkTW|516v^yHDi*bciueo}4gaTs=(3vG0s6#_l2N5D1zi9VOBWOi1 zH>OMY4={H*uvwZLd$nbuC?8n8r@KxfhSE|R8mdonWdAV&J7(CiGC9N4W2ZZ|N`c}P zW@+c({Avd;l-xHpoma1tH>xM2Ma`1<@2RY%AaPNAx6<5n&)lm4g383weRo_Ki4
  • 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

    Date: Sun, 26 Mar 2023 16:56:51 +0200 Subject: [PATCH 2/4] Beginning ApiManager :white_check_mark: --- .../Controllers/v2/ChampionsController.cs | 4 +- .../Sources/Client/ApiManager.Champions.cs | 184 ++++++++++++++++++ .../Sources/Client/ApiManager.RunePages.cs | 73 +++++++ .../Sources/Client/ApiManager.Runes.cs | 63 ++++++ .../Sources/Client/ApiManager.Skins.cs | 63 ++++++ .../Sources/Client/ApiManager.csproj | 1 - .../Sources/Client/ApiManagerData.cs | 24 +++ .../Sources/Client/ChampionHttpClient.cs | 43 ---- .../Sources/Client/Extensions.cs | 33 ++++ .../Sources/Client/HttpClientManager.cs | 19 ++ .../Sources/Client/Program.cs | 15 +- .../Sources/DbManager/DbManager.RunePages.cs | 5 +- .../Sources/DbManager/DbManager.cs | 3 +- .../Sources/DbManager/DbManager.csproj | 1 - .../DbManager/Mapper/ChampionMapper.cs | 2 +- .../Sources/DbManager/Mapper/RuneMapper.cs | 2 +- .../DbManager/Mapper/RunePageMapper.cs | 1 + .../Sources/DbManager/Program.cs | 2 - .../Sources/LolApp/LolApp.csproj | 1 + 19 files changed, 477 insertions(+), 62 deletions(-) create mode 100644 src/EntityFramework_LoL/Sources/Client/ApiManager.Champions.cs create mode 100644 src/EntityFramework_LoL/Sources/Client/ApiManager.RunePages.cs create mode 100644 src/EntityFramework_LoL/Sources/Client/ApiManager.Runes.cs create mode 100644 src/EntityFramework_LoL/Sources/Client/ApiManager.Skins.cs create mode 100644 src/EntityFramework_LoL/Sources/Client/ApiManagerData.cs delete mode 100644 src/EntityFramework_LoL/Sources/Client/ChampionHttpClient.cs create mode 100644 src/EntityFramework_LoL/Sources/Client/Extensions.cs create mode 100644 src/EntityFramework_LoL/Sources/Client/HttpClientManager.cs delete mode 100644 src/EntityFramework_LoL/Sources/DbManager/Program.cs diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v2/ChampionsController.cs b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v2/ChampionsController.cs index a9ca793..e494e6e 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v2/ChampionsController.cs +++ b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v2/ChampionsController.cs @@ -41,7 +41,7 @@ namespace ApiLol.Controllers.v2 return BadRequest($"Champion limit exceed, max {nbTotal}"); } - IEnumerable dtos = (await _manager.ChampionsMgr.GetItems(pageRequest.index, pageRequest.count)) + IEnumerable dtos = (await _manager.ChampionsMgr.GetItems(pageRequest.index, pageRequest.count, pageRequest.orderingPropertyName, pageRequest.descending)) .Select(x => x.ToDto()); return Ok(dtos); } @@ -81,7 +81,7 @@ namespace ApiLol.Controllers.v2 dtos = (await _manager.ChampionsMgr.GetItemsByName(pageRequest.name, pageRequest.index, pageRequest.count, pageRequest.orderingPropertyName, pageRequest.descending)) .Select(x => x.ToDto()); } - return Ok(new PageResponse{ Data = dtos, index = pageRequest.index, count = pageRequest.count, total = nbTotal }); + return Ok(new PageResponse { Data = dtos, index = pageRequest.index, count = pageRequest.count, total = nbTotal }); } catch (Exception error) { diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.Champions.cs b/src/EntityFramework_LoL/Sources/Client/ApiManager.Champions.cs new file mode 100644 index 0000000..06a50b5 --- /dev/null +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.Champions.cs @@ -0,0 +1,184 @@ +using ApiLol.Mapper; +using DTO; +using Model; +using System.Net.Http.Json; + +namespace ApiManager +{ + public partial class ApiManagerData + { + public class ChampionsManager : HttpClientManager, IChampionsManager + { + private const string UrlApiChampions = "/api/v2/champions"; + public ChampionsManager(HttpClient httpClient) : base(httpClient) { } + + public async Task AddItem(Champion? item) + { + try + { + var resp = await _httpClient.PostAsJsonAsync($"{UrlApiChampions}", item.ToDto()); + if (resp.IsSuccessStatusCode) + { + var createdItem = await resp.Content.ReadFromJsonAsync(); + return createdItem?.ToModel(); + } + else + { + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error adding champion: {ex.Message}"); + return null; + } + } + + public async Task DeleteItem(Champion? item) + { + try + { + var resp = await _httpClient.DeleteAsync($"{UrlApiChampions}/{item?.Name}"); + return resp.IsSuccessStatusCode; + } + catch (Exception ex) + { + Console.WriteLine($"Error deleting champion: {ex.Message}"); + return false; + } + } + + private Func filterByNameContains = (champ, substring) => champ.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + private Func filterByName = (champ, substring) => champ.Name.Equals(substring, StringComparison.InvariantCultureIgnoreCase); + + public async Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return response.Select(c => c.ToModel()).GetItemsWithFilterAndOrdering(champ => filterByName(champ, substring), index, count, orderingPropertyName, descending); + } + + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + var url = $"{UrlApiChampions}?index={index}&count={count}&orderingPropertyName={orderingPropertyName}&descending={descending}"; + var response = await _httpClient.GetFromJsonAsync>(url); + return response.Select(c => c.ToModel()); + } + + private Func filterByCharacteristic = (champ, charName) => champ.Characteristics.Keys.Any(k => k.Contains(charName, StringComparison.InvariantCultureIgnoreCase)); + + public async Task> GetItemsByCharacteristic(string charName, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return response.Select(c => c.ToModel()).GetItemsWithFilterAndOrdering( + champ => filterByCharacteristic(champ, charName), + index, count, orderingPropertyName, descending); + } + + private Func filterByClass = (champ, championClass) => champ.Class == championClass; + + public async Task> GetItemsByClass(ChampionClass championClass, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return response.Select(c => c.ToModel()).GetItemsWithFilterAndOrdering( + champ => filterByClass(champ, championClass), + index, count, orderingPropertyName, descending); + } + + public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return response.Select(c => c.ToModel()).GetItemsWithFilterAndOrdering(champ => filterByNameContains(champ, substring), index, count, orderingPropertyName, descending); + } + + public async Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + private Func filterBySkill = (champ, skill) => skill != null && champ.Skills.Contains(skill!); + + private static Func filterBySkillSubstring = (champ, skill) => champ.Skills.Any(s => s.Name.Contains(skill, StringComparison.InvariantCultureIgnoreCase)); + + public async Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return response.Select(c => c.ToModel()).GetItemsWithFilterAndOrdering(champ => filterBySkill(champ, skill), index, count, orderingPropertyName, descending); + } + + public async Task> GetItemsBySkill(string skillSubstring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return response.Select(c => c.ToModel()).GetItemsWithFilterAndOrdering(champ => filterBySkillSubstring(champ, skillSubstring), index, count, orderingPropertyName, descending); + } + + public async Task GetNbItems() + { + var response = await _httpClient.GetAsync("/countChampions"); + var content = await response.Content.ReadAsStringAsync(); + return int.Parse(content); + } + + public async Task GetNbItemsByCharacteristic(string charName) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return await response.GetNbItemsWithFilter(champ => filterByCharacteristic(champ.ToModel(), charName)); + + } + + public async Task GetNbItemsByClass(ChampionClass championClass) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return response.Where(c => c.Class.Equals(championClass)) + .Count(); + } + + public async Task GetNbItemsByName(string substring) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return response.Where(c => c.Name.Equals(substring)) + .Count(); + } + + public Task GetNbItemsByRunePage(RunePage? runePage) + { + throw new NotImplementedException(); + } + + public async Task GetNbItemsBySkill(Skill? skill) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return await response.GetNbItemsWithFilter(champ => filterBySkill(champ.ToModel(), skill)); + } + + public async Task GetNbItemsBySkill(string skill) + { + var response = await _httpClient.GetFromJsonAsync>(UrlApiChampions); + return await response.GetNbItemsWithFilter(champ => filterBySkillSubstring(champ.ToModel(), skill)); + } + + public async Task UpdateItem(Champion? oldItem, Champion? newItem) + { + try + { + var resp = await _httpClient.PutAsJsonAsync($"{UrlApiChampions}/{oldItem?.Name}", newItem.ToDto()); + if (resp.IsSuccessStatusCode) + { + var updatedItem = await resp.Content.ReadFromJsonAsync(); + return updatedItem?.ToModel(); + } + else + { + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error updating champion: {ex.Message}"); + return null; + } + } + + } + } +} diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.RunePages.cs b/src/EntityFramework_LoL/Sources/Client/ApiManager.RunePages.cs new file mode 100644 index 0000000..699353f --- /dev/null +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.RunePages.cs @@ -0,0 +1,73 @@ +using Model; + +namespace ApiManager +{ + public partial class ApiManagerData + { + public class RunePagesManager : HttpClientManager, IRunePagesManager + { + private const string UrlApiRunePages = "/api/RunePages"; + public RunePagesManager(HttpClient httpClient) : base(httpClient) { } + + public Task AddItem(RunePage? item) + { + throw new NotImplementedException(); + } + + public Task DeleteItem(RunePage? item) + { + throw new NotImplementedException(); + } + + public Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByRune(Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task GetNbItems() + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByChampion(Champion? champion) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByName(string substring) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByRune(Rune? rune) + { + throw new NotImplementedException(); + } + + public Task UpdateItem(RunePage? oldItem, RunePage? newItem) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.Runes.cs b/src/EntityFramework_LoL/Sources/Client/ApiManager.Runes.cs new file mode 100644 index 0000000..19fd81d --- /dev/null +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.Runes.cs @@ -0,0 +1,63 @@ +using Model; + +namespace ApiManager +{ + public partial class ApiManagerData + { + public class RunesManager : HttpClientManager, IRunesManager + { + private const string UrlApiRunes = "/api/runes"; + public RunesManager(HttpClient httpClient) : base(httpClient) { } + + public Task AddItem(Rune? item) + { + throw new NotImplementedException(); + } + + public Task DeleteItem(Rune? item) + { + throw new NotImplementedException(); + } + + public Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task GetNbItems() + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByFamily(RuneFamily family) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByName(string substring) + { + throw new NotImplementedException(); + } + + public Task UpdateItem(Rune? oldItem, Rune? newItem) + { + throw new NotImplementedException(); + } + } + } +} \ No newline at end of file diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.Skins.cs b/src/EntityFramework_LoL/Sources/Client/ApiManager.Skins.cs new file mode 100644 index 0000000..487143c --- /dev/null +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.Skins.cs @@ -0,0 +1,63 @@ +using Model; + +namespace ApiManager +{ + public partial class ApiManagerData + { + public class SkinsManager : HttpClientManager, ISkinsManager + { + private const string UrlApiSkins = "/api/Skins"; + public SkinsManager(HttpClient httpClient) : base(httpClient) { } + + public Task AddItem(Skin? item) + { + throw new NotImplementedException(); + } + + public Task DeleteItem(Skin? item) + { + throw new NotImplementedException(); + } + + public Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task GetNbItems() + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByChampion(Champion? champion) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByName(string substring) + { + throw new NotImplementedException(); + } + + public Task UpdateItem(Skin? oldItem, Skin? newItem) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.csproj b/src/EntityFramework_LoL/Sources/Client/ApiManager.csproj index ea66df3..5a28375 100644 --- a/src/EntityFramework_LoL/Sources/Client/ApiManager.csproj +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.csproj @@ -1,7 +1,6 @@ - Exe net6.0 enable enable diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManagerData.cs b/src/EntityFramework_LoL/Sources/Client/ApiManagerData.cs new file mode 100644 index 0000000..b6bf39c --- /dev/null +++ b/src/EntityFramework_LoL/Sources/Client/ApiManagerData.cs @@ -0,0 +1,24 @@ +using Model; + +namespace ApiManager +{ + public partial class ApiManagerData : IDataManager + { + public ApiManagerData(HttpClient httpClient) + { + ChampionsMgr = new ChampionsManager(httpClient); + SkinsMgr = new SkinsManager(httpClient); + RunesMgr = new RunesManager(httpClient); + RunePagesMgr = new RunePagesManager(httpClient); + + } + + public IChampionsManager ChampionsMgr { get; set; } + + public ISkinsManager SkinsMgr { get; set; } + + public IRunesManager RunesMgr { get; set; } + + public IRunePagesManager RunePagesMgr { get; set; } + } +} diff --git a/src/EntityFramework_LoL/Sources/Client/ChampionHttpClient.cs b/src/EntityFramework_LoL/Sources/Client/ChampionHttpClient.cs deleted file mode 100644 index c1e2f46..0000000 --- a/src/EntityFramework_LoL/Sources/Client/ChampionHttpClient.cs +++ /dev/null @@ -1,43 +0,0 @@ -using DTO; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http.Json; -using System.Text; -using System.Threading.Tasks; - -namespace Client -{ - public class ChampionHttpClient - { - private const string UrlApiChampions = "/api/v3/champions"; - private readonly HttpClient _httpClient; - public ChampionHttpClient(HttpClient httpClient) - { - _httpClient = httpClient; - httpClient.BaseAddress = new Uri("https://localhost:7252"); - } - - public async Task> GetChampion(int index, int count) - { - var url = $"{UrlApiChampions}?index={index}&count={count}"; - var Response = await _httpClient.GetFromJsonAsync>(url); - return Response.Data; - } - /* public async void Add(ChampionDto champion) - { - await _httpClient.PostAsJsonAsync(ApiChampions, champion); - }*/ - - /* public async void Delete(ChampionDto champion) - { - await _httpClient.DeleteAsync(champion.Name); - } - - public async void Update(ChampionDto champion) - { - await _httpClient.PutAsJsonAsync(ApiChampions, champion); - }*/ - - } -} diff --git a/src/EntityFramework_LoL/Sources/Client/Extensions.cs b/src/EntityFramework_LoL/Sources/Client/Extensions.cs new file mode 100644 index 0000000..48eee88 --- /dev/null +++ b/src/EntityFramework_LoL/Sources/Client/Extensions.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ApiManager +{ + static class Extensions + { + internal static IEnumerable GetItemsWithFilterAndOrdering(this IEnumerable collection, + Func filter, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + IEnumerable 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); + } + + internal static Task GetNbItemsWithFilter(this IEnumerable collection, Func filter) + { + return Task.FromResult(collection.Count(item => filter(item))); + } + } +} diff --git a/src/EntityFramework_LoL/Sources/Client/HttpClientManager.cs b/src/EntityFramework_LoL/Sources/Client/HttpClientManager.cs new file mode 100644 index 0000000..e9de76a --- /dev/null +++ b/src/EntityFramework_LoL/Sources/Client/HttpClientManager.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ApiManager +{ + public class HttpClientManager + { + protected readonly HttpClient _httpClient; + + public HttpClientManager(HttpClient httpClient) + { + _httpClient = httpClient; + _httpClient.BaseAddress = new Uri("https://localhost:7252"); + } + } +} diff --git a/src/EntityFramework_LoL/Sources/Client/Program.cs b/src/EntityFramework_LoL/Sources/Client/Program.cs index 70ce525..e83d790 100644 --- a/src/EntityFramework_LoL/Sources/Client/Program.cs +++ b/src/EntityFramework_LoL/Sources/Client/Program.cs @@ -1,17 +1,16 @@ -// See https://aka.ms/new-console-template for more information -using Client; -using DTO; +/*// See https://aka.ms/new-console-template for more information +*//*using static ApiManager.ApiManagerData; Console.WriteLine("Hello, World!"); -var championClient = new ChampionHttpClient(new HttpClient()); +var championClient = new ChampionsManager(new HttpClient()); // Get all champions -var champions = await championClient.GetChampion(0,6); +var champions = await championClient.GetItems(0,6); Console.WriteLine("All champions:"); foreach (var champion in champions) { Console.WriteLine($"{champion.Name} ({champion.Bio})"); -} +}*/ /*// Add a new champion var newChampion = new ChampionDto { Name = "Akali", Role = "Assassin" }; @@ -34,6 +33,6 @@ if (championToUpdate != null) Console.WriteLine($"{championToUpdate.Name} updated."); } -*/ +*//* -Console.ReadLine(); \ No newline at end of file +Console.ReadLine();*/ \ No newline at end of file diff --git a/src/EntityFramework_LoL/Sources/DbManager/DbManager.RunePages.cs b/src/EntityFramework_LoL/Sources/DbManager/DbManager.RunePages.cs index efdfc20..1c13a0d 100644 --- a/src/EntityFramework_LoL/Sources/DbManager/DbManager.RunePages.cs +++ b/src/EntityFramework_LoL/Sources/DbManager/DbManager.RunePages.cs @@ -47,9 +47,12 @@ namespace DbLib index, count, orderingPropertyName, descending).Select(c => c.ToModel(parent.DbContext)); public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) - => parent.DbContext.RunePages.Include(rp => rp.Champions).Include(rp => rp.DictionaryCategoryRunes).GetItemsWithFilterAndOrdering( + { + parent.DbContext.Runes.Include(r => r.Image); + return parent.DbContext.RunePages.Include(rp => rp.Champions).Include(rp => rp.DictionaryCategoryRunes).Include(rp => rp.DictionaryCategoryRunes).GetItemsWithFilterAndOrdering( rp => true, index, count, orderingPropertyName, descending).Select(c => c.ToModel(parent.DbContext)); + } public async Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) => parent.DbContext.RunePages.Include(rp => rp.Champions).Include(rp => rp.DictionaryCategoryRunes).GetItemsWithFilterAndOrdering( diff --git a/src/EntityFramework_LoL/Sources/DbManager/DbManager.cs b/src/EntityFramework_LoL/Sources/DbManager/DbManager.cs index 8ad6f6b..d62622b 100644 --- a/src/EntityFramework_LoL/Sources/DbManager/DbManager.cs +++ b/src/EntityFramework_LoL/Sources/DbManager/DbManager.cs @@ -1,5 +1,4 @@ -using Microsoft.EntityFrameworkCore; -using Model; +using Model; using MyFlib; namespace DbLib diff --git a/src/EntityFramework_LoL/Sources/DbManager/DbManager.csproj b/src/EntityFramework_LoL/Sources/DbManager/DbManager.csproj index 48db0d4..84e1abb 100644 --- a/src/EntityFramework_LoL/Sources/DbManager/DbManager.csproj +++ b/src/EntityFramework_LoL/Sources/DbManager/DbManager.csproj @@ -1,7 +1,6 @@ - Exe net6.0 enable enable diff --git a/src/EntityFramework_LoL/Sources/DbManager/Mapper/ChampionMapper.cs b/src/EntityFramework_LoL/Sources/DbManager/Mapper/ChampionMapper.cs index 71755f5..d9a395b 100644 --- a/src/EntityFramework_LoL/Sources/DbManager/Mapper/ChampionMapper.cs +++ b/src/EntityFramework_LoL/Sources/DbManager/Mapper/ChampionMapper.cs @@ -15,7 +15,7 @@ namespace DbManager.Mapper } foreach (var skin in championEntity.Skins) { - champion.AddSkin(new Skin(skin.Name, champion, skin.Price, skin.Icon, skin.Image.Base64, skin.Description)); + champion.AddSkin(new Skin(skin.Name, champion, skin.Price, skin.Icon, "", skin.Description)); } if (championEntity.Characteristics != null) { diff --git a/src/EntityFramework_LoL/Sources/DbManager/Mapper/RuneMapper.cs b/src/EntityFramework_LoL/Sources/DbManager/Mapper/RuneMapper.cs index 788ce1e..744c73f 100644 --- a/src/EntityFramework_LoL/Sources/DbManager/Mapper/RuneMapper.cs +++ b/src/EntityFramework_LoL/Sources/DbManager/Mapper/RuneMapper.cs @@ -6,7 +6,7 @@ namespace DbManager.Mapper { public static class RuneMapper { - public static Rune ToModel(this RuneEntity rune) => new(rune.Name, rune.Family.ToModel(), rune.Icon, rune.Image.Base64, rune.Description); + public static Rune ToModel(this RuneEntity rune) => new(rune.Name, rune.Family.ToModel(), rune.Icon, "", rune.Description); public static RuneEntity ToEntity(this Rune rune) => new() { diff --git a/src/EntityFramework_LoL/Sources/DbManager/Mapper/RunePageMapper.cs b/src/EntityFramework_LoL/Sources/DbManager/Mapper/RunePageMapper.cs index d485243..a5d2025 100644 --- a/src/EntityFramework_LoL/Sources/DbManager/Mapper/RunePageMapper.cs +++ b/src/EntityFramework_LoL/Sources/DbManager/Mapper/RunePageMapper.cs @@ -1,4 +1,5 @@ using DbManager.Mapper.enums; +using Microsoft.EntityFrameworkCore; using Model; using MyFlib; using MyFlib.Entities; diff --git a/src/EntityFramework_LoL/Sources/DbManager/Program.cs b/src/EntityFramework_LoL/Sources/DbManager/Program.cs deleted file mode 100644 index 3751555..0000000 --- a/src/EntityFramework_LoL/Sources/DbManager/Program.cs +++ /dev/null @@ -1,2 +0,0 @@ -// See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World!"); diff --git a/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj b/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj index ab4fa0c..cc14a27 100644 --- a/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj +++ b/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj @@ -82,6 +82,7 @@ + From f66fc1a48db303106959768df1a7c54b5ef31750 Mon Sep 17 00:00:00 2001 From: Emre Date: Sun, 26 Mar 2023 18:31:30 +0200 Subject: [PATCH 3/4] completion of the ApiManager :white_check_mark: --- .../Sources/ApiLol/ApiLol.csproj | 1 + .../ApiLol/Controllers/RunePagesController.cs | 2 +- .../ApiLol/Controllers/RunesController.cs | 2 +- .../ApiLol/Controllers/SkinsController.cs | 2 +- .../Controllers/v1/ChampionsController.cs | 2 +- .../Controllers/v2/ChampionsController.cs | 3 +- .../Sources/ApiMapping/ApiMapping.csproj | 14 ++ .../Mapper => ApiMapping}/ChampionMapper.cs | 82 ++++----- .../Mapper => ApiMapping}/LargeImageMapper.cs | 2 +- .../Mapper => ApiMapping}/RuneMapper.cs | 45 ++--- .../Mapper => ApiMapping}/RunePageMapper.cs | 5 +- .../Mapper => ApiMapping}/SkillMapper.cs | 40 ++--- .../Mapper => ApiMapping}/SkinMapper.cs | 5 +- .../enums/CategoryMapper.cs | 2 +- .../enums/ChampionClassMapper.cs | 106 ++++++------ .../enums/RuneFamilyMapper.cs | 2 +- .../enums/SkillTypeMapper.cs | 2 +- .../Sources/Client/ApiManager.Champions.cs | 2 +- .../Sources/Client/ApiManager.RunePages.cs | 116 ++++++++++--- .../Sources/Client/ApiManager.Runes.cs | 117 ++++++++++--- .../Sources/Client/ApiManager.Skins.cs | 159 +++++++++++++++--- .../Sources/Client/ApiManager.csproj | 3 +- .../Sources/Client/Program.cs | 6 +- .../Sources/LeagueOfLegends.sln | 6 + .../Sources/LolApp/LolApp.csproj | 1 - .../Sources/LolApp/MauiProgram.cs | 74 ++++---- 26 files changed, 543 insertions(+), 258 deletions(-) create mode 100644 src/EntityFramework_LoL/Sources/ApiMapping/ApiMapping.csproj rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/ChampionMapper.cs (94%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/LargeImageMapper.cs (92%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/RuneMapper.cs (87%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/RunePageMapper.cs (94%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/SkillMapper.cs (84%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/SkinMapper.cs (95%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/enums/CategoryMapper.cs (98%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/enums/ChampionClassMapper.cs (96%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/enums/RuneFamilyMapper.cs (97%) rename src/EntityFramework_LoL/Sources/{ApiLol/Mapper => ApiMapping}/enums/SkillTypeMapper.cs (97%) diff --git a/src/EntityFramework_LoL/Sources/ApiLol/ApiLol.csproj b/src/EntityFramework_LoL/Sources/ApiLol/ApiLol.csproj index d01f0d6..b63bbf1 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/ApiLol.csproj +++ b/src/EntityFramework_LoL/Sources/ApiLol/ApiLol.csproj @@ -17,6 +17,7 @@ + diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/RunePagesController.cs b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/RunePagesController.cs index 426cedd..b52a0c7 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/RunePagesController.cs +++ b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/RunePagesController.cs @@ -1,4 +1,4 @@ -using ApiLol.Mapper; +using ApiMapping; using DTO; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/RunesController.cs b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/RunesController.cs index 8d7a2e4..8fba7ed 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/RunesController.cs +++ b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/RunesController.cs @@ -1,4 +1,4 @@ -using ApiLol.Mapper; +using ApiMapping; using DTO; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/SkinsController.cs b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/SkinsController.cs index eb9192a..537923b 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/SkinsController.cs +++ b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/SkinsController.cs @@ -1,4 +1,4 @@ -using ApiLol.Mapper; +using ApiMapping; using DTO; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v1/ChampionsController.cs b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v1/ChampionsController.cs index 2125c70..f33ee8d 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v1/ChampionsController.cs +++ b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v1/ChampionsController.cs @@ -1,4 +1,4 @@ -using ApiLol.Mapper; +using ApiMapping; using DTO; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v2/ChampionsController.cs b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v2/ChampionsController.cs index e494e6e..161a112 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v2/ChampionsController.cs +++ b/src/EntityFramework_LoL/Sources/ApiLol/Controllers/v2/ChampionsController.cs @@ -1,5 +1,4 @@ -using ApiLol.Mapper; -using Azure.Core; +using ApiMapping; using DTO; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; diff --git a/src/EntityFramework_LoL/Sources/ApiMapping/ApiMapping.csproj b/src/EntityFramework_LoL/Sources/ApiMapping/ApiMapping.csproj new file mode 100644 index 0000000..65895ab --- /dev/null +++ b/src/EntityFramework_LoL/Sources/ApiMapping/ApiMapping.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + enable + enable + + + + + + + + diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/ChampionMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/ChampionMapper.cs similarity index 94% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/ChampionMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/ChampionMapper.cs index 9b48da4..524dfcc 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/ChampionMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/ChampionMapper.cs @@ -1,40 +1,42 @@ -using DTO; -using Model; - -namespace ApiLol.Mapper -{ - public static class ChampionMapper - { - public static ChampionDto ToDto(this Champion champion) - => new() - { - Name = champion.Name, - Bio = champion.Bio, - Class = champion.Class.ToDto(), - Icon = champion.Icon, - Image = champion.Image.ToDto(), - Skins = champion.Skins.Select(e => e.ToDto()), - Skills = champion.Skills.Select(e => e.ToDto()), - Characteristics = champion.Characteristics.ToDictionary(c => c.Key, c => c.Value) - - }; - - - public static Champion ToModel(this ChampionDto championDto) - { - var champ = new Champion(championDto.Name, championDto.Class.ToModel(), championDto.Icon, championDto.Image.Base64, championDto.Bio); - foreach (var skin in championDto.Skins) - { - champ.AddSkin(skin.ToModel(champ)); - } - foreach (var skill in championDto.Skills) - { - champ.AddSkill(skill.ToModel()); - } - if (championDto.Characteristics != null) - champ.AddCharacteristics(championDto.Characteristics.Select(c => Tuple.Create(c.Key, c.Value)).ToArray()); - return champ; - } - - } -} +using ApiMapping; +using ApiMapping.enums; +using DTO; +using Model; + +namespace ApiMapping +{ + public static class ChampionMapper + { + public static ChampionDto ToDto(this Champion champion) + => new() + { + Name = champion.Name, + Bio = champion.Bio, + Class = champion.Class.ToDto(), + Icon = champion.Icon, + Image = champion.Image.ToDto(), + Skins = champion.Skins.Select(e => e.ToDto()), + Skills = champion.Skills.Select(e => e.ToDto()), + Characteristics = champion.Characteristics.ToDictionary(c => c.Key, c => c.Value) + + }; + + + public static Champion ToModel(this ChampionDto championDto) + { + var champ = new Champion(championDto.Name, championDto.Class.ToModel(), championDto.Icon, championDto.Image.Base64, championDto.Bio); + foreach (var skin in championDto.Skins) + { + champ.AddSkin(skin.ToModel(champ)); + } + foreach (var skill in championDto.Skills) + { + champ.AddSkill(skill.ToModel()); + } + if (championDto.Characteristics != null) + champ.AddCharacteristics(championDto.Characteristics.Select(c => Tuple.Create(c.Key, c.Value)).ToArray()); + return champ; + } + + } +} diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/LargeImageMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/LargeImageMapper.cs similarity index 92% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/LargeImageMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/LargeImageMapper.cs index a0b8756..44ee496 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/LargeImageMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/LargeImageMapper.cs @@ -1,7 +1,7 @@ using DTO; using Model; -namespace ApiLol.Mapper +namespace ApiMapping { public static class LargeImageMapper { diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/RuneMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/RuneMapper.cs similarity index 87% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/RuneMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/RuneMapper.cs index b11f1aa..8014276 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/RuneMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/RuneMapper.cs @@ -1,22 +1,23 @@ -using ApiLol.Mapper.enums; -using DTO; -using Model; - -namespace ApiLol.Mapper -{ - public static class RuneMapper - { - public static RuneDto ToDto(this Rune rune) - => new() - { - Name = rune.Name, - Description = rune.Description, - Family = rune.Family.ToDto(), - Icon = rune.Icon, - Image = rune.Image.ToDto() - }; - - public static Rune ToModel(this RuneDto rune) => new(rune.Name, rune.Family.ToModel(), rune.Icon, rune.Image.Base64, rune.Description); - - } -} +using ApiMapping; +using ApiMapping.enums; +using DTO; +using Model; + +namespace ApiMapping +{ + public static class RuneMapper + { + public static RuneDto ToDto(this Rune rune) + => new() + { + Name = rune.Name, + Description = rune.Description, + Family = rune.Family.ToDto(), + Icon = rune.Icon, + Image = rune.Image.ToDto() + }; + + public static Rune ToModel(this RuneDto rune) => new(rune.Name, rune.Family.ToModel(), rune.Icon, rune.Image.Base64, rune.Description); + + } +} diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/RunePageMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/RunePageMapper.cs similarity index 94% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/RunePageMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/RunePageMapper.cs index 6ea2bd8..b54b126 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/RunePageMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/RunePageMapper.cs @@ -1,9 +1,8 @@ -using ApiLol.Mapper.enums; -using DTO; +using DTO; using Model; using static Model.RunePage; -namespace ApiLol.Mapper +namespace ApiMapping { public static class RunePageMapper { diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/SkillMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/SkillMapper.cs similarity index 84% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/SkillMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/SkillMapper.cs index 27bb55b..1eee13c 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/SkillMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/SkillMapper.cs @@ -1,19 +1,21 @@ -using DTO; -using Model; - -namespace ApiLol.Mapper -{ - public static class SkillMapper - { - public static SkillDto ToDto(this Skill skill) - => new() - { - Name = skill.Name, - Description = skill.Description, - Type = skill.Type.ToDto() - }; - - public static Skill ToModel(this SkillDto skillDto) => new(skillDto.Name, skillDto.Type.ToModel(), skillDto.Description); - - } -} +using ApiMapping; +using ApiMapping.enums; +using DTO; +using Model; + +namespace ApiMapping +{ + public static class SkillMapper + { + public static SkillDto ToDto(this Skill skill) + => new() + { + Name = skill.Name, + Description = skill.Description, + Type = skill.Type.ToDto() + }; + + public static Skill ToModel(this SkillDto skillDto) => new(skillDto.Name, skillDto.Type.ToModel(), skillDto.Description); + + } +} diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/SkinMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/SkinMapper.cs similarity index 95% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/SkinMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/SkinMapper.cs index d4d7221..16249c3 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/SkinMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/SkinMapper.cs @@ -1,7 +1,8 @@ -using DTO; +using ApiMapping; +using DTO; using Model; -namespace ApiLol.Mapper +namespace ApiMapping { public static class SkinMapper { diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/CategoryMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/enums/CategoryMapper.cs similarity index 98% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/CategoryMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/enums/CategoryMapper.cs index 55dfe9f..10a5c8d 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/CategoryMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/enums/CategoryMapper.cs @@ -1,7 +1,7 @@ using DTO; using Model; -namespace ApiLol.Mapper.enums +namespace ApiMapping.enums { public static class CategoryMapper { diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/ChampionClassMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/enums/ChampionClassMapper.cs similarity index 96% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/ChampionClassMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/enums/ChampionClassMapper.cs index a61f12f..3ac6636 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/ChampionClassMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/enums/ChampionClassMapper.cs @@ -1,53 +1,53 @@ -using DTO; -using Model; - -namespace ApiLol.Mapper -{ - public static class ChampionClassMapper - { - public static ChampionClassDto ToDto(this ChampionClass championClass) - { - switch (championClass) - { - case ChampionClass.Unknown: - return ChampionClassDto.Unknown; - case ChampionClass.Assassin: - return ChampionClassDto.Assassin; - case ChampionClass.Fighter: - return ChampionClassDto.Fighter; - case ChampionClass.Mage: - return ChampionClassDto.Mage; - case ChampionClass.Marksman: - return ChampionClassDto.Marksman; - case ChampionClass.Support: - return ChampionClassDto.Support; - case ChampionClass.Tank: - return ChampionClassDto.Tank; - default: - return ChampionClassDto.Unknown; - } - } - public static ChampionClass ToModel(this ChampionClassDto championClass) - { - switch (championClass) - { - case ChampionClassDto.Unknown: - return ChampionClass.Unknown; - case ChampionClassDto.Assassin: - return ChampionClass.Assassin; - case ChampionClassDto.Fighter: - return ChampionClass.Fighter; - case ChampionClassDto.Mage: - return ChampionClass.Mage; - case ChampionClassDto.Marksman: - return ChampionClass.Marksman; - case ChampionClassDto.Support: - return ChampionClass.Support; - case ChampionClassDto.Tank: - return ChampionClass.Tank; - default: - return ChampionClass.Unknown; - } - } - } -} +using DTO; +using Model; + +namespace ApiMapping.enums +{ + public static class ChampionClassMapper + { + public static ChampionClassDto ToDto(this ChampionClass championClass) + { + switch (championClass) + { + case ChampionClass.Unknown: + return ChampionClassDto.Unknown; + case ChampionClass.Assassin: + return ChampionClassDto.Assassin; + case ChampionClass.Fighter: + return ChampionClassDto.Fighter; + case ChampionClass.Mage: + return ChampionClassDto.Mage; + case ChampionClass.Marksman: + return ChampionClassDto.Marksman; + case ChampionClass.Support: + return ChampionClassDto.Support; + case ChampionClass.Tank: + return ChampionClassDto.Tank; + default: + return ChampionClassDto.Unknown; + } + } + public static ChampionClass ToModel(this ChampionClassDto championClass) + { + switch (championClass) + { + case ChampionClassDto.Unknown: + return ChampionClass.Unknown; + case ChampionClassDto.Assassin: + return ChampionClass.Assassin; + case ChampionClassDto.Fighter: + return ChampionClass.Fighter; + case ChampionClassDto.Mage: + return ChampionClass.Mage; + case ChampionClassDto.Marksman: + return ChampionClass.Marksman; + case ChampionClassDto.Support: + return ChampionClass.Support; + case ChampionClassDto.Tank: + return ChampionClass.Tank; + default: + return ChampionClass.Unknown; + } + } + } +} diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/RuneFamilyMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/enums/RuneFamilyMapper.cs similarity index 97% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/RuneFamilyMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/enums/RuneFamilyMapper.cs index 00f550e..1876fc8 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/RuneFamilyMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/enums/RuneFamilyMapper.cs @@ -2,7 +2,7 @@ using DTO.enums; using Model; -namespace ApiLol.Mapper.enums +namespace ApiMapping.enums { public static class RuneFamilyMapper { diff --git a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/SkillTypeMapper.cs b/src/EntityFramework_LoL/Sources/ApiMapping/enums/SkillTypeMapper.cs similarity index 97% rename from src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/SkillTypeMapper.cs rename to src/EntityFramework_LoL/Sources/ApiMapping/enums/SkillTypeMapper.cs index c21be45..810f031 100644 --- a/src/EntityFramework_LoL/Sources/ApiLol/Mapper/enums/SkillTypeMapper.cs +++ b/src/EntityFramework_LoL/Sources/ApiMapping/enums/SkillTypeMapper.cs @@ -1,7 +1,7 @@ using DTO; using Model; -namespace ApiLol.Mapper +namespace ApiMapping.enums { public static class SkillTypeMapper { diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.Champions.cs b/src/EntityFramework_LoL/Sources/Client/ApiManager.Champions.cs index 06a50b5..8e2b469 100644 --- a/src/EntityFramework_LoL/Sources/Client/ApiManager.Champions.cs +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.Champions.cs @@ -1,4 +1,4 @@ -using ApiLol.Mapper; +using ApiMapping; using DTO; using Model; using System.Net.Http.Json; diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.RunePages.cs b/src/EntityFramework_LoL/Sources/Client/ApiManager.RunePages.cs index 699353f..a7aa88d 100644 --- a/src/EntityFramework_LoL/Sources/Client/ApiManager.RunePages.cs +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.RunePages.cs @@ -1,4 +1,8 @@ -using Model; +using DTO; +using Model; +using System.Net.Http.Json; +using ApiMapping; +using System.Data.SqlTypes; namespace ApiManager { @@ -9,44 +13,91 @@ namespace ApiManager private const string UrlApiRunePages = "/api/RunePages"; public RunePagesManager(HttpClient httpClient) : base(httpClient) { } - public Task AddItem(RunePage? item) + public async Task AddItem(RunePage? item) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.PostAsJsonAsync($"{UrlApiRunePages}", item.ToDto()); + if (resp.IsSuccessStatusCode) + { + var createdItem = await resp.Content.ReadFromJsonAsync(); + return createdItem?.ToModel(); + } + else + { + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error adding runePage: {ex.Message}"); + return null; + } } - public Task DeleteItem(RunePage? item) + public async Task DeleteItem(RunePage? item) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.DeleteAsync($"{UrlApiRunePages}/{item?.Name}"); + return resp.IsSuccessStatusCode; + } + catch (Exception ex) + { + Console.WriteLine($"Error deleting runePage: {ex.Message}"); + return false; + } } - public Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + private static Func filterByName + = (rp, substring) => rp.Name.Equals(substring, StringComparison.InvariantCultureIgnoreCase); + + private static Func filterByNameContains + = (rp, substring) => rp.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + private static Func filterByRune + = (rp, rune) => rune != null && rp.Runes.Values.Contains(rune!); + + public async Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var runePages = await _httpClient.GetFromJsonAsync>(UrlApiRunePages); + return runePages.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( + rp => filterByName(rp, substring), + index, count, orderingPropertyName, descending); } - public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var runePages = await _httpClient.GetFromJsonAsync>($"{UrlApiRunePages}?&index={index}&count={count}&descending={descending}"); + return runePages.Data.Select(c => c.ToModel()); } - public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) { throw new NotImplementedException(); } - public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var runePages = await _httpClient.GetFromJsonAsync>(UrlApiRunePages); + return runePages.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( + rp => filterByNameContains(rp, substring), + index, count, orderingPropertyName, descending); } - public Task> GetItemsByRune(Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByRune(Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var runePages = await _httpClient.GetFromJsonAsync>(UrlApiRunePages); + return runePages.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( + rp => filterByRune(rp, rune), + index, count, orderingPropertyName, descending); } - public Task GetNbItems() + public async Task GetNbItems() { - throw new NotImplementedException(); + var response = await _httpClient.GetAsync("/countRunePages"); + var content = await response.Content.ReadAsStringAsync(); + return int.Parse(content); } public Task GetNbItemsByChampion(Champion? champion) @@ -54,19 +105,40 @@ namespace ApiManager throw new NotImplementedException(); } - public Task GetNbItemsByName(string substring) + public async Task GetNbItemsByName(string substring) { - throw new NotImplementedException(); + var runePages = await _httpClient.GetFromJsonAsync>(UrlApiRunePages); + return await runePages.Data.Select(r => r.ToModel()).GetNbItemsWithFilter( + rp => filterByName(rp, substring)); } - public Task GetNbItemsByRune(Rune? rune) + public async Task GetNbItemsByRune(Rune? rune) { - throw new NotImplementedException(); + var runePages = await _httpClient.GetFromJsonAsync>(UrlApiRunePages); + return await runePages.Data.Select(r => r.ToModel()).GetNbItemsWithFilter( + rp => filterByRune(rp, rune)); } - public Task UpdateItem(RunePage? oldItem, RunePage? newItem) + public async Task UpdateItem(RunePage? oldItem, RunePage? newItem) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.PutAsJsonAsync($"{UrlApiRunePages}/{oldItem?.Name}", newItem.ToDto()); + if (resp.IsSuccessStatusCode) + { + var updatedItem = await resp.Content.ReadFromJsonAsync(); + return updatedItem?.ToModel(); + } + else + { + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error updating runePage: {ex.Message}"); + return null; + } } } } diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.Runes.cs b/src/EntityFramework_LoL/Sources/Client/ApiManager.Runes.cs index 19fd81d..086aed9 100644 --- a/src/EntityFramework_LoL/Sources/Client/ApiManager.Runes.cs +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.Runes.cs @@ -1,4 +1,10 @@ -using Model; +using DTO; +using Model; +using System.Net.Http.Json; +using ApiMapping; +using System; +using System.Data.SqlTypes; +using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace ApiManager { @@ -9,54 +15,123 @@ namespace ApiManager private const string UrlApiRunes = "/api/runes"; public RunesManager(HttpClient httpClient) : base(httpClient) { } - public Task AddItem(Rune? item) + public async Task AddItem(Rune? item) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.PostAsJsonAsync($"{UrlApiRunes}", item.ToDto()); + if (resp.IsSuccessStatusCode) + { + var createdItem = await resp.Content.ReadFromJsonAsync(); + return createdItem?.ToModel(); + } + else + { + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error adding rune: {ex.Message}"); + return null; + } } - public Task DeleteItem(Rune? item) + public async Task DeleteItem(Rune? item) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.DeleteAsync($"{UrlApiRunes}/{item?.Name}"); + return resp.IsSuccessStatusCode; + } + catch (Exception ex) + { + Console.WriteLine($"Error deleting rune: {ex.Message}"); + return false; + } } - public Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + private static Func filterByRuneFamily + = (rune, family) => rune.Family == family; + + private static Func filterByName + = (rune, substring) => rune.Name.Equals(substring, StringComparison.InvariantCultureIgnoreCase); + + private static Func filterByNameContains + = (rune, substring) => rune.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + public async Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); + return runes.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( + rune => filterByName(rune, substring), + index, count, orderingPropertyName, descending); } - public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var runes = await _httpClient.GetFromJsonAsync>($"{UrlApiRunes}?&index={index}&count={count}&descending={descending}"); + return runes.Data.Select(c => c.ToModel()); + } - public Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); + return runes.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( + rune => filterByRuneFamily(rune, family), + index, count, orderingPropertyName, descending); } - public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); + return runes.Data.Select(r => r.ToModel()).GetItemsWithFilterAndOrdering( + rune => filterByNameContains(rune, substring), + index, count, orderingPropertyName, descending); } - public Task GetNbItems() + public async Task GetNbItems() { - throw new NotImplementedException(); + var response = await _httpClient.GetAsync("/countRunes"); + var content = await response.Content.ReadAsStringAsync(); + return int.Parse(content); } - public Task GetNbItemsByFamily(RuneFamily family) + public async Task GetNbItemsByFamily(RuneFamily family) { - throw new NotImplementedException(); + var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); + return await runes.Data.Select(r => r.ToModel()).GetNbItemsWithFilter( + rune => filterByRuneFamily(rune, family)); } - public Task GetNbItemsByName(string substring) + public async Task GetNbItemsByName(string substring) { - throw new NotImplementedException(); + var runes = await _httpClient.GetFromJsonAsync>(UrlApiRunes); + return await runes.Data.Select(r => r.ToModel()).GetNbItemsWithFilter( + rune => filterByName(rune, substring)); } - public Task UpdateItem(Rune? oldItem, Rune? newItem) + public async Task UpdateItem(Rune? oldItem, Rune? newItem) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.PutAsJsonAsync($"{UrlApiRunes}/{oldItem?.Name}", newItem.ToDto()); + if (resp.IsSuccessStatusCode) + { + var updatedItem = await resp.Content.ReadFromJsonAsync(); + return updatedItem?.ToModel(); + } + else + { + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error updating rune: {ex.Message}"); + return null; + } } } } diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.Skins.cs b/src/EntityFramework_LoL/Sources/Client/ApiManager.Skins.cs index 487143c..1153fca 100644 --- a/src/EntityFramework_LoL/Sources/Client/ApiManager.Skins.cs +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.Skins.cs @@ -1,4 +1,8 @@ -using Model; +using DTO; +using Model; +using System.Net.Http.Json; +using ApiMapping; +using System.Data.SqlTypes; namespace ApiManager { @@ -9,54 +13,165 @@ namespace ApiManager private const string UrlApiSkins = "/api/Skins"; public SkinsManager(HttpClient httpClient) : base(httpClient) { } - public Task AddItem(Skin? item) + public async Task AddItem(Skin? item) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.PostAsJsonAsync($"{UrlApiSkins}", item.ToDtoC()); + if (resp.IsSuccessStatusCode) + { + var createdItem = await resp.Content.ReadFromJsonAsync(); + var championManager = new ChampionsManager(_httpClient); + var champ = await championManager.GetItemByName(createdItem.ChampionName, 0, 1); + return createdItem?.ToModelC(champ.First()); + } + else + { + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error adding skin: {ex.Message}"); + return null; + } } - public Task DeleteItem(Skin? item) + public async Task DeleteItem(Skin? item) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.DeleteAsync($"{UrlApiSkins}/{item?.Name}"); + return resp.IsSuccessStatusCode; + } + catch (Exception ex) + { + Console.WriteLine($"Error deleting skin: {ex.Message}"); + return false; + } } - public Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var dtoSkins = await _httpClient.GetFromJsonAsync>(UrlApiSkins); + var skins = new List(); + var championManager = new ChampionsManager(_httpClient); + foreach (var skin in dtoSkins.Data) + { + var champ = await championManager.GetItemByName(skin.ChampionName, 0, 1); + skins.Add(skin.ToModelC(champ.First())); + } + return skins.GetItemsWithFilterAndOrdering( + skin => filterByName(skin, substring), + index, count, orderingPropertyName, descending); } - public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var dtoSkins = await _httpClient.GetFromJsonAsync>($"{UrlApiSkins}?&index={index}&count={count}&descending={descending}"); + var skins = new List(); + var championManager = new ChampionsManager(_httpClient); + foreach (var skin in dtoSkins.Data) + { + var champ = await championManager.GetItemByName(skin.ChampionName, 0, 1); + skins.Add(skin.ToModelC(champ.First())); + } + return skins; } - public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + var dtoSkins = await _httpClient.GetFromJsonAsync>(UrlApiSkins); + var skins = new List(); + var championManager = new ChampionsManager(_httpClient); + foreach (var skin in dtoSkins.Data) + { + var champ = await championManager.GetItemByName(skin.ChampionName, 0, 1); + skins.Add(skin.ToModelC(champ.First())); + } + return skins.GetItemsWithFilterAndOrdering( + skin => filterByChampion(skin, champion), + index, count, orderingPropertyName, descending); } - public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) - { - throw new NotImplementedException(); + private static Func filterByChampion = (skin, champion) => champion != null && skin.Champion.Equals(champion!); + + private static Func filterByName = (skin, substring) => skin.Name.Equals(substring, StringComparison.InvariantCultureIgnoreCase); + + private static Func filterByNameContains = (skin, substring) => skin.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + var dtoSkins = await _httpClient.GetFromJsonAsync>(UrlApiSkins); + var skins = new List(); + var championManager = new ChampionsManager(_httpClient); + foreach (var skin in dtoSkins.Data) + { + var champ = await championManager.GetItemByName(skin.ChampionName,0,1); + skins.Add(skin.ToModelC(champ.First())); + } + return skins.GetItemsWithFilterAndOrdering( + skin => filterByNameContains(skin, substring), + index, count, orderingPropertyName, descending); } - public Task GetNbItems() + public async Task GetNbItems() { - throw new NotImplementedException(); + var response = await _httpClient.GetAsync("/countSkins"); + var content = await response.Content.ReadAsStringAsync(); + return int.Parse(content); } - public Task GetNbItemsByChampion(Champion? champion) + public async Task GetNbItemsByChampion(Champion? champion) { - throw new NotImplementedException(); + var dtoSkins = await _httpClient.GetFromJsonAsync>(UrlApiSkins); + var skins = new List(); + var championManager = new ChampionsManager(_httpClient); + foreach (var skin in dtoSkins.Data) + { + var champ = await championManager.GetItemByName(skin.ChampionName, 0, 1); + skins.Add(skin.ToModelC(champ.First())); + } + return await skins.GetNbItemsWithFilter( + skin => filterByChampion(skin, champion)); } - public Task GetNbItemsByName(string substring) + public async Task GetNbItemsByName(string substring) { - throw new NotImplementedException(); + var dtoSkins = await _httpClient.GetFromJsonAsync>(UrlApiSkins); + var skins = new List(); + var championManager = new ChampionsManager(_httpClient); + foreach (var skin in dtoSkins.Data) + { + var champ = await championManager.GetItemByName(skin.ChampionName, 0, 1); + skins.Add(skin.ToModelC(champ.First())); + } + return await skins.GetNbItemsWithFilter( + skin => filterByName(skin, substring)); } - public Task UpdateItem(Skin? oldItem, Skin? newItem) + public async Task UpdateItem(Skin? oldItem, Skin? newItem) { - throw new NotImplementedException(); + try + { + var resp = await _httpClient.PutAsJsonAsync($"{UrlApiSkins}/{oldItem?.Name}", newItem.ToDto()); + if (resp.IsSuccessStatusCode) + { + var updatedItem = await resp.Content.ReadFromJsonAsync(); + var championManager = new ChampionsManager(_httpClient); + var champ = await championManager.GetItemByName(updatedItem.ChampionName, 0, 1); + return updatedItem?.ToModelC(champ.First()); + } + else + { + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error updating skin: {ex.Message}"); + return null; + } } } } diff --git a/src/EntityFramework_LoL/Sources/Client/ApiManager.csproj b/src/EntityFramework_LoL/Sources/Client/ApiManager.csproj index 5a28375..61b1c54 100644 --- a/src/EntityFramework_LoL/Sources/Client/ApiManager.csproj +++ b/src/EntityFramework_LoL/Sources/Client/ApiManager.csproj @@ -7,8 +7,9 @@ - + + diff --git a/src/EntityFramework_LoL/Sources/Client/Program.cs b/src/EntityFramework_LoL/Sources/Client/Program.cs index e83d790..d55ea82 100644 --- a/src/EntityFramework_LoL/Sources/Client/Program.cs +++ b/src/EntityFramework_LoL/Sources/Client/Program.cs @@ -1,5 +1,5 @@ /*// See https://aka.ms/new-console-template for more information -*//*using static ApiManager.ApiManagerData; +using static ApiManager.ApiManagerData; Console.WriteLine("Hello, World!"); var championClient = new ChampionsManager(new HttpClient()); @@ -10,9 +10,9 @@ Console.WriteLine("All champions:"); foreach (var champion in champions) { Console.WriteLine($"{champion.Name} ({champion.Bio})"); -}*/ +} -/*// Add a new champion +*//*// Add a new champion var newChampion = new ChampionDto { Name = "Akali", Role = "Assassin" }; championClient.Add(newChampion); diff --git a/src/EntityFramework_LoL/Sources/LeagueOfLegends.sln b/src/EntityFramework_LoL/Sources/LeagueOfLegends.sln index 339d0ce..0b6b133 100644 --- a/src/EntityFramework_LoL/Sources/LeagueOfLegends.sln +++ b/src/EntityFramework_LoL/Sources/LeagueOfLegends.sln @@ -33,6 +33,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LolApp", "LolApp\LolApp.csp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ViewModels", "ViewModels\ViewModels.csproj", "{65135247-E1AB-4EE4-9473-DFDE6AFCC250}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiMapping", "ApiMapping\ApiMapping.csproj", "{F8D44A32-788B-4E63-B379-278B90216E28}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -93,6 +95,10 @@ Global {65135247-E1AB-4EE4-9473-DFDE6AFCC250}.Debug|Any CPU.Build.0 = Debug|Any CPU {65135247-E1AB-4EE4-9473-DFDE6AFCC250}.Release|Any CPU.ActiveCfg = Release|Any CPU {65135247-E1AB-4EE4-9473-DFDE6AFCC250}.Release|Any CPU.Build.0 = Release|Any CPU + {F8D44A32-788B-4E63-B379-278B90216E28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8D44A32-788B-4E63-B379-278B90216E28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8D44A32-788B-4E63-B379-278B90216E28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8D44A32-788B-4E63-B379-278B90216E28}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj b/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj index cc14a27..ab4fa0c 100644 --- a/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj +++ b/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj @@ -82,7 +82,6 @@ - diff --git a/src/EntityFramework_LoL/Sources/LolApp/MauiProgram.cs b/src/EntityFramework_LoL/Sources/LolApp/MauiProgram.cs index c12deff..c4baebc 100644 --- a/src/EntityFramework_LoL/Sources/LolApp/MauiProgram.cs +++ b/src/EntityFramework_LoL/Sources/LolApp/MauiProgram.cs @@ -1,39 +1,37 @@ using CommunityToolkit.Maui; -using LolApp.ViewModels; -using Microsoft.Extensions.Logging; -using Microsoft.Maui.Handlers; -using Microsoft.Maui.Platform; -using Model; -using StubLib; -using ViewModels; - -namespace LolApp; - -public static class MauiProgram -{ - public static MauiApp CreateMauiApp() - { - var builder = MauiApp.CreateBuilder(); - builder - .UseMauiApp() - .UseMauiCommunityToolkit() - .ConfigureFonts(fonts => - { - fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); - fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); - fonts.AddFont("Font Awesome 6 Free-Solid-900.otf", "FASolid"); - }); - builder.Services.AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton(); - -#if DEBUG - builder.Logging.AddDebug(); -#endif - - return builder.Build(); - } -} - +using LolApp.ViewModels; +using Microsoft.Extensions.Logging; +using Model; +using StubLib; +using ViewModels; + +namespace LolApp; + +public static class MauiProgram +{ + public static MauiApp CreateMauiApp() + { + var builder = MauiApp.CreateBuilder(); + builder + .UseMauiApp() + .UseMauiCommunityToolkit() + .ConfigureFonts(fonts => + { + fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); + fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); + fonts.AddFont("Font Awesome 6 Free-Solid-900.otf", "FASolid"); + }); + builder.Services.AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton(); + +#if DEBUG + builder.Logging.AddDebug(); +#endif + + return builder.Build(); + } +} + From 8f28944450c9798357f6d5e66528b4f2218ce509 Mon Sep 17 00:00:00 2001 From: Emre Date: Sun, 26 Mar 2023 20:14:08 +0200 Subject: [PATCH 4/4] Correct some errors :bug: --- .vs/LolProject2/v17/.wsuo | Bin 11776 -> 14848 bytes .../Sources/LolApp/LolApp.csproj | 1 + .../Sources/LolApp/MauiProgram.cs | 3 +- .../Sources/MyFlib/DataBase.db | Bin 131072 -> 131072 bytes .../Sources/MyFlib/LolDbContext.cs | 4 +- .../20230325231552_myMigration.Designer.cs | 671 ------------------ .../Migrations/20230325231552_myMigration.cs | 375 ---------- .../Migrations/LolDbContextModelSnapshot.cs | 668 ----------------- 8 files changed, 5 insertions(+), 1717 deletions(-) delete mode 100644 src/EntityFramework_LoL/Sources/MyFlib/Migrations/20230325231552_myMigration.Designer.cs delete mode 100644 src/EntityFramework_LoL/Sources/MyFlib/Migrations/20230325231552_myMigration.cs delete mode 100644 src/EntityFramework_LoL/Sources/MyFlib/Migrations/LolDbContextModelSnapshot.cs diff --git a/.vs/LolProject2/v17/.wsuo b/.vs/LolProject2/v17/.wsuo index a3c6a23b9c918ddb4773fdccbeab0281ee2123ba..cc1d1dca29e22053c6e76b0b580e1d0e53f3b019 100644 GIT binary patch delta 1373 zcmcIj%}*0i5bxV=VJUC>u?v;L(gke*g_JnjbdnMiN<&^kb z2iW;bbpHVoxq)9t<3HhnCYl&<=E*Y+k#I0hGTC|aW@mo$do%7Mx4wOyh2GqVDvZOR zVs}(4dtdp|7nX!Z+Xr~3WJA$FAn*j92j}@Qih?Kl!e=9`r|{5*N}>T%O)sow>6V0} z^XRvEY@i)O?LgI0$sNaU1odcVv9F^SjXu;)e-RUTN|{*%CsG_afrEFu8f+*VY!I5t z!a2xT3YzWqWh&E-e}+-XCP|=8Es@=WUxGsrx(N$83G*p9;bM%uQoAq`s$t82I#iXkOY34PrG8@#MU}mv))x zhDJbw^?I<&p)wDlPri>pdpK0lMHICwqoF=p6)9+{q*E|T?2$k`Wy9mteyTPx@p9(s zz59jiRKY2{s4cJ5rmtlmek4jTOtbUg+PC4AT>wYXKuhF3KBxT~kFPzWB;e6ZOL*WW zu|=Z{rJ#eQROC0R5X#X1FoTu_FtBOdK@u~?fPz_ zh!|piY~&mBj9J>&lkVq*{ipjoIy>Dy)Xj>{sJ+%D5aZM4{}^poMB-SE{k6Q;HG39k z`=T_`VD+~(}j#o*^=J~P!<$kLDFanJ*Lm+9B4F! zp3XebmP;ZPjDitw(laoSZ$d7fgWmLO$LLk2DF|&>NwlIjU3+vQ00UPM*5X&-sr#Bp zS<(weX4q1BZjm#7#BMOio;j45AFaMg56#a*M=6NZi21Q03fck>Kb0Kp1XSoO=}Vpa92DvB#v%wg}VA#&DdJVFt|6Hd8NL$N=0;HLj>XSicgAL9$Fq) znkH*9_8|kGR&GHvCDU2ZQr9Di3#mr3+DOJ~wQ4=4s`qQLYARiesrBV*LtR$W^+dz? zmhv$0q{9%Ndkc$xpY`@f0jswP8UH#6$&1H!N*5H61>WciO{TkY|Ec`2?|E#r&Ucya z%Zl_FMl(%aHH+Nw6<|j>2YbGf#OMdmM33tjE{in!@+7$zE*shCo8w|)!??uXVxIgn Orj4e}YkXg_bH4zEI7war diff --git a/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj b/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj index ab4fa0c..cc14a27 100644 --- a/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj +++ b/src/EntityFramework_LoL/Sources/LolApp/LolApp.csproj @@ -82,6 +82,7 @@ + diff --git a/src/EntityFramework_LoL/Sources/LolApp/MauiProgram.cs b/src/EntityFramework_LoL/Sources/LolApp/MauiProgram.cs index c4baebc..7a3494e 100644 --- a/src/EntityFramework_LoL/Sources/LolApp/MauiProgram.cs +++ b/src/EntityFramework_LoL/Sources/LolApp/MauiProgram.cs @@ -1,4 +1,5 @@ -using CommunityToolkit.Maui; +using ApiManager; +using CommunityToolkit.Maui; using LolApp.ViewModels; using Microsoft.Extensions.Logging; using Model; diff --git a/src/EntityFramework_LoL/Sources/MyFlib/DataBase.db b/src/EntityFramework_LoL/Sources/MyFlib/DataBase.db index d3b2cb4df3b4923712556f2c8e0cc56361cfc791..df215a334ce8981b1d849d7d669a4ed7eb8e7abc 100644 GIT binary patch delta 3685 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 W%rTfNHlguMVq>}ULUj5@Li_`ME$(Un diff --git a/src/EntityFramework_LoL/Sources/MyFlib/LolDbContext.cs b/src/EntityFramework_LoL/Sources/MyFlib/LolDbContext.cs index 2a3ebb1..96aac02 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/LolDbContext.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/LolDbContext.cs @@ -33,8 +33,8 @@ namespace MyFlib protected override void OnModelCreating(ModelBuilder modelBuilder) { //LargeImageEntity - LargeImageEntity image1 = new LargeImageEntity { Id = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}"), Base64 = "empty" }; - LargeImageEntity image2 = new LargeImageEntity { Id = Guid.Parse("{9f9086f5-5cc5-47b5-af9b-a935f4e9b89c}"), Base64 = " " }; + LargeImageEntity image1 = new LargeImageEntity { Id = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}"), Base64 = "UklGRtwDAABXRUJQVlA4INADAAAwEACdASoqACoAAMASJZgCdMoSCz655ndU4XXAP2yXIge5neM/Qd6WCfO8evoj2S0A/p7+f0An85cBxlLDgPC8jO/0nsl/13/O8vvzj7Af8s/p3/H4FU6td4MCwq23z1H2uzoKIXaqJniPI/bRMf8qzv0Zp+HE1RCBw5WQ1j/JovdM1FS52+QcaAAA/v/+NxU4DpPk3+xQPW7tcmURSo9vC4qc+XMxNVBzEM5E8actDz98gmwTXgD62e9EmG/ervdd2ovFFSuxYppWl/wtaX3rkn0xrt8qOql/5I2jfLOnCU0kALLcW4F/wTjU10qsxZXW9fxauC6OPVRF28sc94V9ocmoSWy+sf6jW3vYkVOh+gE/RE0L6b2d3oFyHmkRJnfYwG8o3p6fv9pivNF5aopIBzFnjzwb/VqSq3/b+MWKFmjr8T1qe4/fITo2vBWEqDyogV3ZVGnDVi2DbiEFVSUr2eXTNZQ9V/D9QC/+vCR5TGyX9QOVBgtAYtm/ZTIwzPEYB9NrV1NeO1/sAz78u0tW59r0I+SO5Jgm3B9i1toRurzHv9EZJ9yZL8nafb/T1FaoPDkuJfM+iPs0j8xnS7TaU/gEK0wCxeDYRYtJx9j4hUQq7pAu/T2yWy0vjcUHki952ZNbXnXxB8m8pV5x9E1sfLj5MZEgpU2XV8RHrVvWniCjsf6vgxmR7+KtwIbMjahitUGtHet1WdL+8MmdL29iQJC37pDXirir1NibxKKhFYRuJ3xW9O0r9+Vnh8diqbBuXqDbYR/MSoHvscOCm2t95dN5WBdRUoD7YCG/ZHWc7Ypv/x/al4fkB2lZlYhVWHxjaoeF9jEPI0gAN5XsvUI6hbzEzWMsNW/1orkNOnlskalgmpI4B2rm4Gc7LNui+MuMBrpnBvLkbYX9exe9g8tu7wLt7ScOjDcL99oOyR89Mh9L8rd4+43+JQyR6tsIfcPJo6T6FxHf11d/MGayJi+SWct/uhvvua0oOh+zXNIaUzgoBmu1XULjkpuA0Ghzctf30jbY1AOM49qbMZRYS9A+0S1HrHPnwRvpQY/Sj4xKPn0gdpv/+iTbKJb8zkPC4/9af0Jvesa+GDG0/iw3TswenMhqlh7BM9MW5txpeblsByx4WnJ/oHv6cc0dmM7tsV36lYkCTUXEf/0eKlnfivnN0g1g+j/Lk9et/uoa6TFCW0HgwFOIVFumEYdT675PfuTrYO5o8ZrWEIHtv2Ctlrv9J3TrslD/iKEwtipGHtn0Vak8B9wLL+kz+CIQ/VG4KJpXjx88CeCC4XaGitEdjAAA" }; + LargeImageEntity image2 = new LargeImageEntity { Id = Guid.Parse("{9f9086f5-5cc5-47b5-af9b-a935f4e9b89c}"), Base64 = "UklGRtwDAABXRUJQVlA4INADAAAwEACdASoqACoAAMASJZgCdMoSCz655ndU4XXAP2yXIge5neM/Qd6WCfO8evoj2S0A/p7+f0An85cBxlLDgPC8jO/0nsl/13/O8vvzj7Af8s/p3/H4FU6td4MCwq23z1H2uzoKIXaqJniPI/bRMf8qzv0Zp+HE1RCBw5WQ1j/JovdM1FS52+QcaAAA/v/+NxU4DpPk3+xQPW7tcmURSo9vC4qc+XMxNVBzEM5E8actDz98gmwTXgD62e9EmG/ervdd2ovFFSuxYppWl/wtaX3rkn0xrt8qOql/5I2jfLOnCU0kALLcW4F/wTjU10qsxZXW9fxauC6OPVRF28sc94V9ocmoSWy+sf6jW3vYkVOh+gE/RE0L6b2d3oFyHmkRJnfYwG8o3p6fv9pivNF5aopIBzFnjzwb/VqSq3/b+MWKFmjr8T1qe4/fITo2vBWEqDyogV3ZVGnDVi2DbiEFVSUr2eXTNZQ9V/D9QC/+vCR5TGyX9QOVBgtAYtm/ZTIwzPEYB9NrV1NeO1/sAz78u0tW59r0I+SO5Jgm3B9i1toRurzHv9EZJ9yZL8nafb/T1FaoPDkuJfM+iPs0j8xnS7TaU/gEK0wCxeDYRYtJx9j4hUQq7pAu/T2yWy0vjcUHki952ZNbXnXxB8m8pV5x9E1sfLj5MZEgpU2XV8RHrVvWniCjsf6vgxmR7+KtwIbMjahitUGtHet1WdL+8MmdL29iQJC37pDXirir1NibxKKhFYRuJ3xW9O0r9+Vnh8diqbBuXqDbYR/MSoHvscOCm2t95dN5WBdRUoD7YCG/ZHWc7Ypv/x/al4fkB2lZlYhVWHxjaoeF9jEPI0gAN5XsvUI6hbzEzWMsNW/1orkNOnlskalgmpI4B2rm4Gc7LNui+MuMBrpnBvLkbYX9exe9g8tu7wLt7ScOjDcL99oOyR89Mh9L8rd4+43+JQyR6tsIfcPJo6T6FxHf11d/MGayJi+SWct/uhvvua0oOh+zXNIaUzgoBmu1XULjkpuA0Ghzctf30jbY1AOM49qbMZRYS9A+0S1HrHPnwRvpQY/Sj4xKPn0gdpv/+iTbKJb8zkPC4/9af0Jvesa+GDG0/iw3TswenMhqlh7BM9MW5txpeblsByx4WnJ/oHv6cc0dmM7tsV36lYkCTUXEf/0eKlnfivnN0g1g+j/Lk9et/uoa6TFCW0HgwFOIVFumEYdT675PfuTrYO5o8ZrWEIHtv2Ctlrv9J3TrslD/iKEwtipGHtn0Vak8B9wLL+kz+CIQ/VG4KJpXjx88CeCC4XaGitEdjAAA" }; modelBuilder.Entity().HasData(image1, image2); diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Migrations/20230325231552_myMigration.Designer.cs b/src/EntityFramework_LoL/Sources/MyFlib/Migrations/20230325231552_myMigration.Designer.cs deleted file mode 100644 index 3cd96b3..0000000 --- a/src/EntityFramework_LoL/Sources/MyFlib/Migrations/20230325231552_myMigration.Designer.cs +++ /dev/null @@ -1,671 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyFlib; - -#nullable disable - -namespace MyFlib.Migrations -{ - [DbContext(typeof(LolDbContext))] - [Migration("20230325231552_myMigration")] - partial class myMigration - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); - - modelBuilder.Entity("ChampionEntityRunePageEntity", b => - { - b.Property("ChampionsId") - .HasColumnType("TEXT"); - - b.Property("RunePagesName") - .HasColumnType("TEXT"); - - b.HasKey("ChampionsId", "RunePagesName"); - - b.HasIndex("RunePagesName"); - - b.ToTable("ChampionEntityRunePageEntity"); - }); - - modelBuilder.Entity("MyFlib.ChampionEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Bio") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("TEXT"); - - b.Property("Class") - .HasColumnType("INTEGER"); - - b.Property("Icon") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ImageId") - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("ImageId"); - - b.ToTable("Champions"); - - b.HasData( - new - { - Id = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Bio = "", - Class = 1, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Akali" - }, - new - { - Id = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Bio = "", - Class = 2, - Icon = "", - ImageId = new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), - Name = "Aatrox" - }, - new - { - Id = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Bio = "", - Class = 3, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Ahri" - }, - new - { - Id = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Bio = "", - Class = 4, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Akshan" - }, - new - { - Id = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Bio = "", - Class = 5, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Bard" - }, - new - { - Id = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Bio = "", - Class = 6, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Alistar" - }); - }); - - modelBuilder.Entity("MyFlib.DictionaryCategoryRune", b => - { - b.Property("RunePageName") - .HasColumnType("TEXT"); - - b.Property("RuneName") - .HasColumnType("TEXT"); - - b.Property("category") - .HasColumnType("INTEGER"); - - b.HasKey("RunePageName", "RuneName"); - - b.HasIndex("RuneName"); - - b.ToTable("CategoryRunes"); - - b.HasData( - new - { - RunePageName = "Page 1", - RuneName = "Hextech Flashtraption ", - category = 0 - }, - new - { - RunePageName = "Page 1", - RuneName = "Manaflow Band ", - category = 1 - }, - new - { - RunePageName = "Page 2", - RuneName = "Manaflow Band ", - category = 4 - }, - new - { - RunePageName = "Page 2", - RuneName = "Hextech Flashtraption ", - category = 5 - }); - }); - - modelBuilder.Entity("MyFlib.Entities.CharacteristicEntity", b => - { - b.Property("Name") - .HasMaxLength(254) - .HasColumnType("TEXT"); - - b.Property("ChampionForeignKey") - .HasColumnType("TEXT"); - - b.Property("Value") - .HasColumnType("INTEGER"); - - b.HasKey("Name", "ChampionForeignKey"); - - b.HasIndex("ChampionForeignKey"); - - b.ToTable("Characteristic"); - - b.HasData( - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 58 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 92 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 6 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 526 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 418 - }, - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 68 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 0 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 1 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 570 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 350 - }, - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 70 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 0 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 1 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 580 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 0 - }, - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 56 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 0 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 1 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 575 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 200 - }, - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 63 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 0 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 2 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 573 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 278 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Value = 30 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Value = 1 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Value = 535 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Value = 350 - }); - }); - - modelBuilder.Entity("MyFlib.Entities.RunePageEntity", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.ToTable("RunePages"); - - b.HasData( - new - { - Name = "Page 1" - }, - new - { - Name = "Page 2" - }); - }); - - modelBuilder.Entity("MyFlib.LargeImageEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Base64") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("LargeImages"); - - b.HasData( - new - { - Id = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Base64 = "empty" - }, - new - { - Id = new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), - Base64 = " " - }); - }); - - modelBuilder.Entity("MyFlib.RuneEntity", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("TEXT"); - - b.Property("Description") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("Family") - .HasColumnType("INTEGER"); - - b.Property("Icon") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ImageId") - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.HasIndex("ImageId"); - - b.ToTable("Runes"); - - b.HasData( - new - { - Name = "Hextech Flashtraption ", - Description = "While Flash is on cooldown, it is replaced by Hexflash.", - Family = 0, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65") - }, - new - { - Name = "Manaflow Band ", - Description = "Hitting enemy champions with a spell grants 25 maximum mana, up to 250 mana.", - Family = 2, - Icon = "", - ImageId = new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c") - }); - }); - - modelBuilder.Entity("MyFlib.SkillEntity", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("TEXT"); - - b.Property("ChampionForeignKey") - .HasColumnType("TEXT"); - - b.Property("Description") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("Type") - .HasColumnType("INTEGER"); - - b.HasKey("Name"); - - b.HasIndex("ChampionForeignKey"); - - b.ToTable("Skills"); - - b.HasData( - new - { - Name = "Boule de feu", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Description = "Fire!", - Type = 1 - }, - new - { - Name = "White Star", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Description = "Random damage", - Type = 3 - }); - }); - - modelBuilder.Entity("MyFlib.SkinEntity", b => - { - b.Property("Name") - .HasMaxLength(254) - .HasColumnType("TEXT"); - - b.Property("ChampionForeignKey") - .HasColumnType("TEXT"); - - b.Property("Description") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("TEXT"); - - b.Property("Icon") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ImageId") - .HasColumnType("TEXT"); - - b.Property("Price") - .HasColumnType("REAL"); - - b.HasKey("Name"); - - b.HasIndex("ChampionForeignKey"); - - b.HasIndex("ImageId"); - - b.ToTable("Skins"); - - b.HasData( - new - { - Name = "Akali Infernale", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Description = "Djinn qu'on invoque en dessous du monde, l'Infernale connue sous le nom d'Akali réduira en cendres les ennemis de son maître… mais le prix de son service est toujours exorbitant.", - Icon = "empty", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Price = 520f - }, - new - { - Name = "Akshan Cyberpop", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Description = "Les bas-fonds d'Audio City ont un nouveau héros : le Rebelle fluo. Cette position, Akshan la doit à son courage, sa sagesse et sa capacité à s'infiltrer dans des bâtiments d'affaires hautement sécurisés, et ce, sans être repéré. Son charme ravageur l'a aussi beaucoup aidé.", - Icon = "empty", - ImageId = new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), - Price = 1350f - }); - }); - - modelBuilder.Entity("ChampionEntityRunePageEntity", b => - { - b.HasOne("MyFlib.ChampionEntity", null) - .WithMany() - .HasForeignKey("ChampionsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyFlib.Entities.RunePageEntity", null) - .WithMany() - .HasForeignKey("RunePagesName") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MyFlib.ChampionEntity", b => - { - b.HasOne("MyFlib.LargeImageEntity", "Image") - .WithMany() - .HasForeignKey("ImageId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Image"); - }); - - modelBuilder.Entity("MyFlib.DictionaryCategoryRune", b => - { - b.HasOne("MyFlib.RuneEntity", "rune") - .WithMany("DictionaryCategoryRunes") - .HasForeignKey("RuneName") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyFlib.Entities.RunePageEntity", "runePage") - .WithMany("DictionaryCategoryRunes") - .HasForeignKey("RunePageName") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("rune"); - - b.Navigation("runePage"); - }); - - modelBuilder.Entity("MyFlib.Entities.CharacteristicEntity", b => - { - b.HasOne("MyFlib.ChampionEntity", "Champion") - .WithMany("Characteristics") - .HasForeignKey("ChampionForeignKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Champion"); - }); - - modelBuilder.Entity("MyFlib.RuneEntity", b => - { - b.HasOne("MyFlib.LargeImageEntity", "Image") - .WithMany() - .HasForeignKey("ImageId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Image"); - }); - - modelBuilder.Entity("MyFlib.SkillEntity", b => - { - b.HasOne("MyFlib.ChampionEntity", "Champion") - .WithMany("Skills") - .HasForeignKey("ChampionForeignKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Champion"); - }); - - modelBuilder.Entity("MyFlib.SkinEntity", b => - { - b.HasOne("MyFlib.ChampionEntity", "Champion") - .WithMany("Skins") - .HasForeignKey("ChampionForeignKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyFlib.LargeImageEntity", "Image") - .WithMany() - .HasForeignKey("ImageId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Champion"); - - b.Navigation("Image"); - }); - - modelBuilder.Entity("MyFlib.ChampionEntity", b => - { - b.Navigation("Characteristics"); - - b.Navigation("Skills"); - - b.Navigation("Skins"); - }); - - modelBuilder.Entity("MyFlib.Entities.RunePageEntity", b => - { - b.Navigation("DictionaryCategoryRunes"); - }); - - modelBuilder.Entity("MyFlib.RuneEntity", b => - { - b.Navigation("DictionaryCategoryRunes"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Migrations/20230325231552_myMigration.cs b/src/EntityFramework_LoL/Sources/MyFlib/Migrations/20230325231552_myMigration.cs deleted file mode 100644 index c5ed594..0000000 --- a/src/EntityFramework_LoL/Sources/MyFlib/Migrations/20230325231552_myMigration.cs +++ /dev/null @@ -1,375 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional - -namespace MyFlib.Migrations -{ - /// - public partial class myMigration : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "LargeImages", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Base64 = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_LargeImages", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "RunePages", - columns: table => new - { - Name = table.Column(type: "TEXT", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_RunePages", x => x.Name); - }); - - migrationBuilder.CreateTable( - name: "Champions", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", maxLength: 64, nullable: false), - Bio = table.Column(type: "TEXT", maxLength: 255, nullable: false), - Icon = table.Column(type: "TEXT", nullable: false), - Class = table.Column(type: "INTEGER", nullable: false), - ImageId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Champions", x => x.Id); - table.ForeignKey( - name: "FK_Champions_LargeImages_ImageId", - column: x => x.ImageId, - principalTable: "LargeImages", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Runes", - columns: table => new - { - Name = table.Column(type: "TEXT", maxLength: 64, nullable: false), - Description = table.Column(type: "TEXT", maxLength: 500, nullable: false), - Family = table.Column(type: "INTEGER", nullable: false), - Icon = table.Column(type: "TEXT", nullable: false), - ImageId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Runes", x => x.Name); - table.ForeignKey( - name: "FK_Runes_LargeImages_ImageId", - column: x => x.ImageId, - principalTable: "LargeImages", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "ChampionEntityRunePageEntity", - columns: table => new - { - ChampionsId = table.Column(type: "TEXT", nullable: false), - RunePagesName = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ChampionEntityRunePageEntity", x => new { x.ChampionsId, x.RunePagesName }); - table.ForeignKey( - name: "FK_ChampionEntityRunePageEntity_Champions_ChampionsId", - column: x => x.ChampionsId, - principalTable: "Champions", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_ChampionEntityRunePageEntity_RunePages_RunePagesName", - column: x => x.RunePagesName, - principalTable: "RunePages", - principalColumn: "Name", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Characteristic", - columns: table => new - { - Name = table.Column(type: "TEXT", maxLength: 254, nullable: false), - ChampionForeignKey = table.Column(type: "TEXT", nullable: false), - Value = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Characteristic", x => new { x.Name, x.ChampionForeignKey }); - table.ForeignKey( - name: "FK_Characteristic_Champions_ChampionForeignKey", - column: x => x.ChampionForeignKey, - principalTable: "Champions", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Skills", - columns: table => new - { - Name = table.Column(type: "TEXT", maxLength: 64, nullable: false), - Description = table.Column(type: "TEXT", maxLength: 500, nullable: false), - Type = table.Column(type: "INTEGER", nullable: false), - ChampionForeignKey = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Skills", x => x.Name); - table.ForeignKey( - name: "FK_Skills_Champions_ChampionForeignKey", - column: x => x.ChampionForeignKey, - principalTable: "Champions", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Skins", - columns: table => new - { - Name = table.Column(type: "TEXT", maxLength: 254, nullable: false), - Description = table.Column(type: "TEXT", maxLength: 1000, nullable: false), - Icon = table.Column(type: "TEXT", nullable: false), - Price = table.Column(type: "REAL", nullable: false), - ChampionForeignKey = table.Column(type: "TEXT", nullable: false), - ImageId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Skins", x => x.Name); - table.ForeignKey( - name: "FK_Skins_Champions_ChampionForeignKey", - column: x => x.ChampionForeignKey, - principalTable: "Champions", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Skins_LargeImages_ImageId", - column: x => x.ImageId, - principalTable: "LargeImages", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "CategoryRunes", - columns: table => new - { - RunePageName = table.Column(type: "TEXT", nullable: false), - RuneName = table.Column(type: "TEXT", nullable: false), - category = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CategoryRunes", x => new { x.RunePageName, x.RuneName }); - table.ForeignKey( - name: "FK_CategoryRunes_RunePages_RunePageName", - column: x => x.RunePageName, - principalTable: "RunePages", - principalColumn: "Name", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_CategoryRunes_Runes_RuneName", - column: x => x.RuneName, - principalTable: "Runes", - principalColumn: "Name", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.InsertData( - table: "LargeImages", - columns: new[] { "Id", "Base64" }, - values: new object[,] - { - { new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), "empty" }, - { new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), " " } - }); - - migrationBuilder.InsertData( - table: "RunePages", - column: "Name", - values: new object[] - { - "Page 1", - "Page 2" - }); - - migrationBuilder.InsertData( - table: "Champions", - columns: new[] { "Id", "Bio", "Class", "Icon", "ImageId", "Name" }, - values: new object[,] - { - { new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), "", 6, "", new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), "Alistar" }, - { new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), "", 4, "", new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), "Akshan" }, - { new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), "", 1, "", new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), "Akali" }, - { new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), "", 5, "", new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), "Bard" }, - { new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), "", 2, "", new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), "Aatrox" }, - { new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), "", 3, "", new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), "Ahri" } - }); - - migrationBuilder.InsertData( - table: "Runes", - columns: new[] { "Name", "Description", "Family", "Icon", "ImageId" }, - values: new object[,] - { - { "Hextech Flashtraption ", "While Flash is on cooldown, it is replaced by Hexflash.", 0, "", new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65") }, - { "Manaflow Band ", "Hitting enemy champions with a spell grants 25 maximum mana, up to 250 mana.", 2, "", new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c") } - }); - - migrationBuilder.InsertData( - table: "CategoryRunes", - columns: new[] { "RuneName", "RunePageName", "category" }, - values: new object[,] - { - { "Hextech Flashtraption ", "Page 1", 0 }, - { "Manaflow Band ", "Page 1", 1 }, - { "Hextech Flashtraption ", "Page 2", 5 }, - { "Manaflow Band ", "Page 2", 4 } - }); - - migrationBuilder.InsertData( - table: "Characteristic", - columns: new[] { "ChampionForeignKey", "Name", "Value" }, - values: new object[,] - { - { new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), "Ability Power", 0 }, - { new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), "Ability Power", 0 }, - { new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), "Ability Power", 0 }, - { new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), "Ability Power", 30 }, - { new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), "Ability Power", 0 }, - { new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), "Ability Power", 92 }, - { new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), "Attack Damage", 63 }, - { new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), "Attack Damage", 68 }, - { new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), "Attack Damage", 56 }, - { new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), "Attack Damage", 70 }, - { new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), "Attack Damage", 58 }, - { new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), "Attack Speed", 2 }, - { new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), "Attack Speed", 1 }, - { new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), "Attack Speed", 1 }, - { new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), "Attack Speed", 1 }, - { new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), "Attack Speed", 1 }, - { new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), "Attack Speed", 6 }, - { new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), "Health", 573 }, - { new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), "Health", 570 }, - { new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), "Health", 575 }, - { new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), "Health", 535 }, - { new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), "Health", 580 }, - { new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), "Health", 526 }, - { new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), "Mana", 278 }, - { new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), "Mana", 350 }, - { new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), "Mana", 200 }, - { new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), "Mana", 350 }, - { new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), "Mana", 0 }, - { new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), "Mana", 418 } - }); - - migrationBuilder.InsertData( - table: "Skills", - columns: new[] { "Name", "ChampionForeignKey", "Description", "Type" }, - values: new object[,] - { - { "Boule de feu", new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), "Fire!", 1 }, - { "White Star", new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), "Random damage", 3 } - }); - - migrationBuilder.InsertData( - table: "Skins", - columns: new[] { "Name", "ChampionForeignKey", "Description", "Icon", "ImageId", "Price" }, - values: new object[,] - { - { "Akali Infernale", new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), "Djinn qu'on invoque en dessous du monde, l'Infernale connue sous le nom d'Akali réduira en cendres les ennemis de son maître… mais le prix de son service est toujours exorbitant.", "empty", new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), 520f }, - { "Akshan Cyberpop", new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), "Les bas-fonds d'Audio City ont un nouveau héros : le Rebelle fluo. Cette position, Akshan la doit à son courage, sa sagesse et sa capacité à s'infiltrer dans des bâtiments d'affaires hautement sécurisés, et ce, sans être repéré. Son charme ravageur l'a aussi beaucoup aidé.", "empty", new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), 1350f } - }); - - migrationBuilder.CreateIndex( - name: "IX_CategoryRunes_RuneName", - table: "CategoryRunes", - column: "RuneName"); - - migrationBuilder.CreateIndex( - name: "IX_ChampionEntityRunePageEntity_RunePagesName", - table: "ChampionEntityRunePageEntity", - column: "RunePagesName"); - - migrationBuilder.CreateIndex( - name: "IX_Champions_ImageId", - table: "Champions", - column: "ImageId"); - - migrationBuilder.CreateIndex( - name: "IX_Characteristic_ChampionForeignKey", - table: "Characteristic", - column: "ChampionForeignKey"); - - migrationBuilder.CreateIndex( - name: "IX_Runes_ImageId", - table: "Runes", - column: "ImageId"); - - migrationBuilder.CreateIndex( - name: "IX_Skills_ChampionForeignKey", - table: "Skills", - column: "ChampionForeignKey"); - - migrationBuilder.CreateIndex( - name: "IX_Skins_ChampionForeignKey", - table: "Skins", - column: "ChampionForeignKey"); - - migrationBuilder.CreateIndex( - name: "IX_Skins_ImageId", - table: "Skins", - column: "ImageId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "CategoryRunes"); - - migrationBuilder.DropTable( - name: "ChampionEntityRunePageEntity"); - - migrationBuilder.DropTable( - name: "Characteristic"); - - migrationBuilder.DropTable( - name: "Skills"); - - migrationBuilder.DropTable( - name: "Skins"); - - migrationBuilder.DropTable( - name: "Runes"); - - migrationBuilder.DropTable( - name: "RunePages"); - - migrationBuilder.DropTable( - name: "Champions"); - - migrationBuilder.DropTable( - name: "LargeImages"); - } - } -} diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Migrations/LolDbContextModelSnapshot.cs b/src/EntityFramework_LoL/Sources/MyFlib/Migrations/LolDbContextModelSnapshot.cs deleted file mode 100644 index 3a1cbfe..0000000 --- a/src/EntityFramework_LoL/Sources/MyFlib/Migrations/LolDbContextModelSnapshot.cs +++ /dev/null @@ -1,668 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyFlib; - -#nullable disable - -namespace MyFlib.Migrations -{ - [DbContext(typeof(LolDbContext))] - partial class LolDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); - - modelBuilder.Entity("ChampionEntityRunePageEntity", b => - { - b.Property("ChampionsId") - .HasColumnType("TEXT"); - - b.Property("RunePagesName") - .HasColumnType("TEXT"); - - b.HasKey("ChampionsId", "RunePagesName"); - - b.HasIndex("RunePagesName"); - - b.ToTable("ChampionEntityRunePageEntity"); - }); - - modelBuilder.Entity("MyFlib.ChampionEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Bio") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("TEXT"); - - b.Property("Class") - .HasColumnType("INTEGER"); - - b.Property("Icon") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ImageId") - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("ImageId"); - - b.ToTable("Champions"); - - b.HasData( - new - { - Id = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Bio = "", - Class = 1, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Akali" - }, - new - { - Id = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Bio = "", - Class = 2, - Icon = "", - ImageId = new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), - Name = "Aatrox" - }, - new - { - Id = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Bio = "", - Class = 3, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Ahri" - }, - new - { - Id = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Bio = "", - Class = 4, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Akshan" - }, - new - { - Id = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Bio = "", - Class = 5, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Bard" - }, - new - { - Id = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Bio = "", - Class = 6, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Name = "Alistar" - }); - }); - - modelBuilder.Entity("MyFlib.DictionaryCategoryRune", b => - { - b.Property("RunePageName") - .HasColumnType("TEXT"); - - b.Property("RuneName") - .HasColumnType("TEXT"); - - b.Property("category") - .HasColumnType("INTEGER"); - - b.HasKey("RunePageName", "RuneName"); - - b.HasIndex("RuneName"); - - b.ToTable("CategoryRunes"); - - b.HasData( - new - { - RunePageName = "Page 1", - RuneName = "Hextech Flashtraption ", - category = 0 - }, - new - { - RunePageName = "Page 1", - RuneName = "Manaflow Band ", - category = 1 - }, - new - { - RunePageName = "Page 2", - RuneName = "Manaflow Band ", - category = 4 - }, - new - { - RunePageName = "Page 2", - RuneName = "Hextech Flashtraption ", - category = 5 - }); - }); - - modelBuilder.Entity("MyFlib.Entities.CharacteristicEntity", b => - { - b.Property("Name") - .HasMaxLength(254) - .HasColumnType("TEXT"); - - b.Property("ChampionForeignKey") - .HasColumnType("TEXT"); - - b.Property("Value") - .HasColumnType("INTEGER"); - - b.HasKey("Name", "ChampionForeignKey"); - - b.HasIndex("ChampionForeignKey"); - - b.ToTable("Characteristic"); - - b.HasData( - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 58 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 92 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 6 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 526 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("ae5fe535-f041-445e-b570-28b75bc78cb9"), - Value = 418 - }, - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 68 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 0 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 1 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 570 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Value = 350 - }, - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 70 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 0 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 1 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 580 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("a4f84d92-c20f-4f2d-b3f9-ca00ef556e72"), - Value = 0 - }, - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 56 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 0 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 1 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 575 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Value = 200 - }, - new - { - Name = "Attack Damage", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 63 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 0 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 2 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 573 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("36ad2a82-d17b-47de-8a95-6e154a7df557"), - Value = 278 - }, - new - { - Name = "Ability Power", - ChampionForeignKey = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Value = 30 - }, - new - { - Name = "Attack Speed", - ChampionForeignKey = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Value = 1 - }, - new - { - Name = "Health", - ChampionForeignKey = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Value = 535 - }, - new - { - Name = "Mana", - ChampionForeignKey = new Guid("7f7746fa-b1cb-49da-9409-4b3e6910500e"), - Value = 350 - }); - }); - - modelBuilder.Entity("MyFlib.Entities.RunePageEntity", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.ToTable("RunePages"); - - b.HasData( - new - { - Name = "Page 1" - }, - new - { - Name = "Page 2" - }); - }); - - modelBuilder.Entity("MyFlib.LargeImageEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Base64") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("LargeImages"); - - b.HasData( - new - { - Id = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Base64 = "empty" - }, - new - { - Id = new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), - Base64 = " " - }); - }); - - modelBuilder.Entity("MyFlib.RuneEntity", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("TEXT"); - - b.Property("Description") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("Family") - .HasColumnType("INTEGER"); - - b.Property("Icon") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ImageId") - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.HasIndex("ImageId"); - - b.ToTable("Runes"); - - b.HasData( - new - { - Name = "Hextech Flashtraption ", - Description = "While Flash is on cooldown, it is replaced by Hexflash.", - Family = 0, - Icon = "", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65") - }, - new - { - Name = "Manaflow Band ", - Description = "Hitting enemy champions with a spell grants 25 maximum mana, up to 250 mana.", - Family = 2, - Icon = "", - ImageId = new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c") - }); - }); - - modelBuilder.Entity("MyFlib.SkillEntity", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("TEXT"); - - b.Property("ChampionForeignKey") - .HasColumnType("TEXT"); - - b.Property("Description") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("Type") - .HasColumnType("INTEGER"); - - b.HasKey("Name"); - - b.HasIndex("ChampionForeignKey"); - - b.ToTable("Skills"); - - b.HasData( - new - { - Name = "Boule de feu", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Description = "Fire!", - Type = 1 - }, - new - { - Name = "White Star", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Description = "Random damage", - Type = 3 - }); - }); - - modelBuilder.Entity("MyFlib.SkinEntity", b => - { - b.Property("Name") - .HasMaxLength(254) - .HasColumnType("TEXT"); - - b.Property("ChampionForeignKey") - .HasColumnType("TEXT"); - - b.Property("Description") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("TEXT"); - - b.Property("Icon") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ImageId") - .HasColumnType("TEXT"); - - b.Property("Price") - .HasColumnType("REAL"); - - b.HasKey("Name"); - - b.HasIndex("ChampionForeignKey"); - - b.HasIndex("ImageId"); - - b.ToTable("Skins"); - - b.HasData( - new - { - Name = "Akali Infernale", - ChampionForeignKey = new Guid("4422c524-b2cb-43ef-8263-990c3cea7cae"), - Description = "Djinn qu'on invoque en dessous du monde, l'Infernale connue sous le nom d'Akali réduira en cendres les ennemis de son maître… mais le prix de son service est toujours exorbitant.", - Icon = "empty", - ImageId = new Guid("8d121cdc-6787-4738-8edd-9e026ac16b65"), - Price = 520f - }, - new - { - Name = "Akshan Cyberpop", - ChampionForeignKey = new Guid("3708dcfd-02a1-491e-b4f7-e75bf274cf23"), - Description = "Les bas-fonds d'Audio City ont un nouveau héros : le Rebelle fluo. Cette position, Akshan la doit à son courage, sa sagesse et sa capacité à s'infiltrer dans des bâtiments d'affaires hautement sécurisés, et ce, sans être repéré. Son charme ravageur l'a aussi beaucoup aidé.", - Icon = "empty", - ImageId = new Guid("9f9086f5-5cc5-47b5-af9b-a935f4e9b89c"), - Price = 1350f - }); - }); - - modelBuilder.Entity("ChampionEntityRunePageEntity", b => - { - b.HasOne("MyFlib.ChampionEntity", null) - .WithMany() - .HasForeignKey("ChampionsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyFlib.Entities.RunePageEntity", null) - .WithMany() - .HasForeignKey("RunePagesName") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MyFlib.ChampionEntity", b => - { - b.HasOne("MyFlib.LargeImageEntity", "Image") - .WithMany() - .HasForeignKey("ImageId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Image"); - }); - - modelBuilder.Entity("MyFlib.DictionaryCategoryRune", b => - { - b.HasOne("MyFlib.RuneEntity", "rune") - .WithMany("DictionaryCategoryRunes") - .HasForeignKey("RuneName") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyFlib.Entities.RunePageEntity", "runePage") - .WithMany("DictionaryCategoryRunes") - .HasForeignKey("RunePageName") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("rune"); - - b.Navigation("runePage"); - }); - - modelBuilder.Entity("MyFlib.Entities.CharacteristicEntity", b => - { - b.HasOne("MyFlib.ChampionEntity", "Champion") - .WithMany("Characteristics") - .HasForeignKey("ChampionForeignKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Champion"); - }); - - modelBuilder.Entity("MyFlib.RuneEntity", b => - { - b.HasOne("MyFlib.LargeImageEntity", "Image") - .WithMany() - .HasForeignKey("ImageId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Image"); - }); - - modelBuilder.Entity("MyFlib.SkillEntity", b => - { - b.HasOne("MyFlib.ChampionEntity", "Champion") - .WithMany("Skills") - .HasForeignKey("ChampionForeignKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Champion"); - }); - - modelBuilder.Entity("MyFlib.SkinEntity", b => - { - b.HasOne("MyFlib.ChampionEntity", "Champion") - .WithMany("Skins") - .HasForeignKey("ChampionForeignKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MyFlib.LargeImageEntity", "Image") - .WithMany() - .HasForeignKey("ImageId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Champion"); - - b.Navigation("Image"); - }); - - modelBuilder.Entity("MyFlib.ChampionEntity", b => - { - b.Navigation("Characteristics"); - - b.Navigation("Skills"); - - b.Navigation("Skins"); - }); - - modelBuilder.Entity("MyFlib.Entities.RunePageEntity", b => - { - b.Navigation("DictionaryCategoryRunes"); - }); - - modelBuilder.Entity("MyFlib.RuneEntity", b => - { - b.Navigation("DictionaryCategoryRunes"); - }); -#pragma warning restore 612, 618 - } - } -}