From 28d833c94d3febadfa159c5dfcd9ccad755fc079 Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Sun, 13 May 2018 13:02:45 +0200 Subject: [PATCH] =?UTF-8?q?Pr=C3=A9paration=20cr=C3=A9ation=20de=20la=20bd?= =?UTF-8?q?d=20+=20=C3=A9viter=20de=20recr=C3=A9er=20des=20HttpClient=20?= =?UTF-8?q?=C3=A0=20chaque=20fois?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AideDeJeu/AideDeJeu.iOS/AideDeJeu.iOS.csproj | 68 ++++++++--- .../AideDeJeu/Services/ItemDatabaseHelper.cs | 28 ++++- .../AideDeJeu/ViewModels/AboutViewModel.cs | 44 ++++++- .../AideDeJeu/ViewModels/BaseViewModel.cs | 4 +- .../ViewModels/SpellDetailViewModel.cs | 7 +- .../AideDeJeu/ViewModels/SpellsViewModel.cs | 6 +- AideDeJeu/AideDeJeu/Views/AboutPage.xaml | 9 +- .../Monsters/MonstersScrappers.cs | 80 ++++++++++--- .../AideDeJeuLib/Spells/SpellsScrappers.cs | 113 ++++++++++++------ 9 files changed, 279 insertions(+), 80 deletions(-) diff --git a/AideDeJeu/AideDeJeu.iOS/AideDeJeu.iOS.csproj b/AideDeJeu/AideDeJeu.iOS/AideDeJeu.iOS.csproj index d47ba378..a1dcfc0a 100644 --- a/AideDeJeu/AideDeJeu.iOS/AideDeJeu.iOS.csproj +++ b/AideDeJeu/AideDeJeu.iOS/AideDeJeu.iOS.csproj @@ -151,23 +151,57 @@ - - - - - - - - - - - - - - - - - + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + diff --git a/AideDeJeu/AideDeJeu/Services/ItemDatabaseHelper.cs b/AideDeJeu/AideDeJeu/Services/ItemDatabaseHelper.cs index 2e3f9eb9..16081fb1 100644 --- a/AideDeJeu/AideDeJeu/Services/ItemDatabaseHelper.cs +++ b/AideDeJeu/AideDeJeu/Services/ItemDatabaseHelper.cs @@ -1,4 +1,5 @@ -using AideDeJeuLib.Spells; +using AideDeJeuLib.Monsters; +using AideDeJeuLib.Spells; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; @@ -42,5 +43,30 @@ namespace AideDeJeu.Services await context.SaveChangesAsync(); } } + + public async Task> GetMonstersAsync() + { + using (var context = CreateContext()) + { + //We use OrderByDescending because Posts are generally displayed from most recent to oldest + return await context.Monsters + .AsNoTracking() + .OrderByDescending(monster => monster.Id) + .ToListAsync(); + } + } + + public async Task AddOrUpdateMonstersAsync(IEnumerable monsters) + { + using (var context = CreateContext()) + { + // add posts that do not exist in the database + var newMonsters = monsters.Where( + monster => context.Monsters.Any(dbMonster => dbMonster.Id == monster.Id) == false + ); + await context.Monsters.AddRangeAsync(newMonsters); + await context.SaveChangesAsync(); + } + } } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/AboutViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/AboutViewModel.cs index ece38a10..1a712382 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/AboutViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/AboutViewModel.cs @@ -1,5 +1,10 @@ -using AideDeJeu.Tools; +using AideDeJeu.Services; +using AideDeJeu.Tools; +using AideDeJeuLib.Monsters; +using AideDeJeuLib.Spells; using System; +using System.Collections.Generic; +using System.Threading.Tasks; using System.Windows.Input; using Xamarin.Forms; @@ -13,9 +18,11 @@ namespace AideDeJeu.ViewModels Title = "À propos de ..."; OpenWebCommand = new Command(() => Device.OpenUri(new Uri("https://nioux.github.io/AideDeJeu/"))); + UpdateDataCommand = new Command(async() => await ExecuteUpdateDataCommandAsync()); } public ICommand OpenWebCommand { get; } + public ICommand UpdateDataCommand { get; } public string Version { get @@ -23,5 +30,40 @@ namespace AideDeJeu.ViewModels return DependencyService.Get().GetVersion(); } } + + private int countUpdateData = 0; + private async Task ExecuteUpdateDataCommandAsync() + { + if (countUpdateData++ != 5) return; + + IsBusy = true; + var helper = new ItemDatabaseHelper(); + + using (var spellsScrappers = new SpellsScrappers()) + { + var partialSpells = await spellsScrappers.GetSpells(); + var spells = new List(); + foreach (var partialSpell in partialSpells) + { + var spell = await spellsScrappers.GetSpell(partialSpell.Id); + spells.Add(spell); + } + await helper.AddOrUpdateSpellsAsync(spells); + } + + using (var monstersScrappers = new MonstersScrappers()) + { + var partialMonsters = await monstersScrappers.GetMonsters(); + var monsters = new List(); + foreach (var partialMonster in partialMonsters) + { + var monster = await monstersScrappers.GetMonster(partialMonster.Id); + monsters.Add(monster); + } + await helper.AddOrUpdateMonstersAsync(monsters); + } + + IsBusy = false; + } } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs index f77b8e12..26d76dcb 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs @@ -12,8 +12,8 @@ namespace AideDeJeu.ViewModels { public class BaseViewModel : INotifyPropertyChanged { - public SpellsScrappers SpellsScrappers => DependencyService.Get() ?? new SpellsScrappers(); - public MonstersScrappers MonsterScrappers => DependencyService.Get() ?? new MonstersScrappers(); + //public SpellsScrappers SpellsScrappers => DependencyService.Get() ?? new SpellsScrappers(); + //public MonstersScrappers MonstersScrappers => DependencyService.Get() ?? new MonstersScrappers(); bool isBusy = false; public bool IsBusy diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs index 1426c37b..1d947c24 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs @@ -120,8 +120,11 @@ namespace AideDeJeu.ViewModels try { - var item = await SpellsScrappers.GetSpell(Item.Id); - Item = item; + using (var spellsScrappers = new SpellsScrappers()) + { + var item = await spellsScrappers.GetSpell(Item.Id); + Item = item; + } } catch (Exception ex) { diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs index 834e0539..177a2165 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs @@ -170,7 +170,11 @@ namespace AideDeJeu.ViewModels try { AllItems.Clear(); - var items = await SpellsScrappers.GetSpells(classe: Classes[Classe].Key, niveauMin: Niveaux[NiveauMin].Key, niveauMax: Niveaux[NiveauMax].Key, ecole: Ecoles[Ecole].Key, rituel: Rituels[Rituel].Key, source: Sources[Source].Key); + IEnumerable items = null; + using (var spellsScrappers = new SpellsScrappers()) + { + items = await spellsScrappers.GetSpells(classe: Classes[Classe].Key, niveauMin: Niveaux[NiveauMin].Key, niveauMax: Niveaux[NiveauMax].Key, ecole: Ecoles[Ecole].Key, rituel: Rituels[Rituel].Key, source: Sources[Source].Key); + } //try //{ diff --git a/AideDeJeu/AideDeJeu/Views/AboutPage.xaml b/AideDeJeu/AideDeJeu/Views/AboutPage.xaml index 0293f70b..47c268e1 100644 --- a/AideDeJeu/AideDeJeu/Views/AboutPage.xaml +++ b/AideDeJeu/AideDeJeu/Views/AboutPage.xaml @@ -3,7 +3,8 @@ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="AideDeJeu.Views.AboutPage" xmlns:vm="clr-namespace:AideDeJeu.ViewModels;" - Title="{Binding Title}"> + Title="{Binding Title}" + IsBusy="{Binding IsBusy}"> @@ -21,7 +22,11 @@ -