Update(Back-End): CSharpier par la
continuous-integration/drone/push Build is failing Details

Back-End
Louis DUFOUR 2 years ago
parent f07ea2f058
commit d4e4958c1b

@ -1,46 +1,46 @@
using BookApp.ViewModel; using BookApp.ViewModel;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
namespace BookApp.Composants; namespace BookApp.Composants;
public partial class CollectionFiltrage : ContentView public partial class CollectionFiltrage : ContentView
{ {
/* public class ObjetTemp /* public class ObjetTemp
{ {
public string AuteurName { get; set; } public string AuteurName { get; set; }
public int NbLivre { get; set; } public int NbLivre { get; set; }
public ObjetTemp(string name, int number) public ObjetTemp(string name, int number)
{ {
AuteurName = name; AuteurName = name;
NbLivre = number; NbLivre = number;
} }
} }
public ObservableCollection<ObjetTemp> MyCollections1 { get; set; }*/ public ObservableCollection<ObjetTemp> MyCollections1 { get; set; }*/
public CollectionFiltrage(ViewModelManager data) public CollectionFiltrage(ViewModelManager data)
{ {
InitializeComponent(); InitializeComponent();
/*MyCollections1 = new ObservableCollection<ObjetTemp>() /*MyCollections1 = new ObservableCollection<ObjetTemp>()
{ {
new ObjetTemp("Victor Hugo", 10), new ObjetTemp("Victor Hugo", 10),
new ObjetTemp("Jane Austen", 3), new ObjetTemp("Jane Austen", 3),
new ObjetTemp("F. Scott Fitzgerald", 5), new ObjetTemp("F. Scott Fitzgerald", 5),
new ObjetTemp("George Orwell", 4), new ObjetTemp("George Orwell", 4),
new ObjetTemp("Haruki Murakami", 8), new ObjetTemp("Haruki Murakami", 8),
new ObjetTemp("Gabriel Garc<72>a M<>rquez", 9), new ObjetTemp("Gabriel Garc<72>a M<>rquez", 9),
new ObjetTemp("J.K. Rowling", 9), new ObjetTemp("J.K. Rowling", 9),
new ObjetTemp("Leo Tolstoy", 9), new ObjetTemp("Leo Tolstoy", 9),
new ObjetTemp("Ernest Hemingway", 9), new ObjetTemp("Ernest Hemingway", 9),
new ObjetTemp("Agatha Christie", 9), new ObjetTemp("Agatha Christie", 9),
new ObjetTemp("Mark Twain", 9), new ObjetTemp("Mark Twain", 9),
new ObjetTemp("J.R.R. Tolkien", 9), new ObjetTemp("J.R.R. Tolkien", 9),
new ObjetTemp("William Shakespeare", 9), new ObjetTemp("William Shakespeare", 9),
new ObjetTemp("Charles Dickensn", 9), new ObjetTemp("Charles Dickensn", 9),
new ObjetTemp("Isaac Asimov", 9), new ObjetTemp("Isaac Asimov", 9),
};*/ };*/
BindingContext = data; BindingContext = data;
} }
} }

@ -33,7 +33,6 @@ namespace BookApp
builder.Services.AddSingleton<ViewModel.ViewModelManager>(); builder.Services.AddSingleton<ViewModel.ViewModelManager>();
builder.Services.AddSingleton<Filtrage>(); builder.Services.AddSingleton<Filtrage>();
builder.Services.AddSingleton<CollectionFiltrage>(); builder.Services.AddSingleton<CollectionFiltrage>();
// transient pour recharger la data à l'execute // transient pour recharger la data à l'execute

@ -9,30 +9,30 @@ public partial class DetailBook : ContentPage
public Book BookDetail { get; set; } public Book BookDetail { get; set; }
*/ */
public DetailBook()//Book ItemBook) public DetailBook() //Book ItemBook)
{ {
InitializeComponent(); InitializeComponent();
/* for (int i = 1; i <= maxStars; i++) /* for (int i = 1; i <= maxStars; i++)
{ {
var star = new Image var star = new Image
{ {
Source = "empty_star.svg", // image d'une étoile vide Source = "empty_star.svg", // image d'une étoile vide
WidthRequest = 25, WidthRequest = 25,
HeightRequest = 25 HeightRequest = 25
}; };
int currentStar = i; int currentStar = i;
star.GestureRecognizers.Add( star.GestureRecognizers.Add(
new TapGestureRecognizer { Command = new Command(() => StarTapped(currentStar)), } new TapGestureRecognizer { Command = new Command(() => StarTapped(currentStar)), }
); );
StarLayout.Children.Add(star); StarLayout.Children.Add(star);
} }
UpdateStars(); UpdateStars();
BookDetail = ItemBook; BookDetail = ItemBook;
BindingContext = this;*/ BindingContext = this;*/
} }
/* /*
private void StarTapped(int rating) private void StarTapped(int rating)

@ -1,6 +1,6 @@
using BookApp.ViewModel; using BookApp.ViewModel;
using VMWrapper; using VMWrapper;
namespace BookApp.Pages namespace BookApp.Pages
{ {
public partial class Filtrage : ContentPage public partial class Filtrage : ContentPage
@ -10,7 +10,7 @@ namespace BookApp.Pages
public Filtrage(BookViewModel data) public Filtrage(BookViewModel data)
{ {
InitializeComponent(); InitializeComponent();
BindingContext= data; BindingContext = data;
} }
async void BackButton(object sender, EventArgs args) async void BackButton(object sender, EventArgs args)

@ -1,24 +1,20 @@
using Model; using Model;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using VMWrapper; using VMWrapper;
using static System.Runtime.InteropServices.JavaScript.JSType; using static System.Runtime.InteropServices.JavaScript.JSType;
namespace BookApp.ViewModel; namespace BookApp.ViewModel;
public class ViewModelManager
{
public class ViewModelManager BookViewModel _viewModel;
{
BookViewModel _viewModel;
public ObservableCollection<Author> Authors { get; set; } = new ObservableCollection<Author>(); public ObservableCollection<Author> Authors { get; set; } = new ObservableCollection<Author>();
/* public ObservableCollection<AuteurGroup> AuteurGroups { get; private set; } = /* public ObservableCollection<AuteurGroup> AuteurGroups { get; private set; } =
new ObservableCollection<AuteurGroup>();*/ new ObservableCollection<AuteurGroup>();*/
public ViewModelManager(BookViewModel viewModel) public ViewModelManager(BookViewModel viewModel)
{ {
_viewModel = viewModel; _viewModel = viewModel;
//GetAuthors(); //GetAuthors();
/* ObservableCollection<Auteur> auteurs = new Stub().CreateStubData(); /* ObservableCollection<Auteur> auteurs = new Stub().CreateStubData();
@ -26,10 +22,10 @@ public class ViewModelManager
{ {
AuteurGroups.Add(new AuteurGroup(auteur.Name, auteur.Books)); AuteurGroups.Add(new AuteurGroup(auteur.Name, auteur.Books));
}*/ }*/
} }
//fireandforget //fireandforget
/*public async void GetAuthors() /*public async void GetAuthors()
{ {
var authors1 = await _viewModel.GetAuthors(); var authors1 = await _viewModel.GetAuthors();
@ -37,8 +33,8 @@ public class ViewModelManager
foreach (var author in authors1) foreach (var author in authors1)
{ {
Authors.Add(author); Authors.Add(author);
} }
}*/ }*/
} }
/*public class AuteurGroup : ObservableCollection<Book> /*public class AuteurGroup : ObservableCollection<Book>
@ -50,4 +46,4 @@ public class ViewModelManager
{ {
Name = name; Name = name;
} }
}*/ }*/

@ -6,7 +6,5 @@ using System.Threading.Tasks;
namespace BookApp.ViewModel namespace BookApp.ViewModel
{ {
internal class ViewModelNavigation internal class ViewModelNavigation { }
{
}
} }

@ -36,7 +36,12 @@ public interface IDtoManager
/// </ul> /// </ul>
/// </param> /// </param>
/// <returns>max <i>count</i> books</returns> /// <returns>max <i>count</i> books</returns>
Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByTitle(string title, int index, int count, string sort = ""); Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByTitle(
string title,
int index,
int count,
string sort = ""
);
/// <summary> /// <summary>
/// get books of a particular author by giving the author id /// get books of a particular author by giving the author id
@ -53,7 +58,12 @@ public interface IDtoManager
/// </ul> /// </ul>
/// </param> /// </param>
/// <returns>max <i>count</i> books</returns> /// <returns>max <i>count</i> books</returns>
Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthorId(string authorId, int index, int count, string sort = ""); Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthorId(
string authorId,
int index,
int count,
string sort = ""
);
/// <summary> /// <summary>
/// get books of authors whose name (or alternate names) contains a particular substring /// get books of authors whose name (or alternate names) contains a particular substring
@ -70,7 +80,12 @@ public interface IDtoManager
/// </ul> /// </ul>
/// </param> /// </param>
/// <returns>max <i>count</i> books</returns> /// <returns>max <i>count</i> books</returns>
Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthor(string author, int index, int count, string sort = ""); Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthor(
string author,
int index,
int count,
string sort = ""
);
/// <summary> /// <summary>
/// get an author by specifying its id /// get an author by specifying its id
@ -92,6 +107,10 @@ public interface IDtoManager
/// </ul> /// </ul>
/// </param> /// </param>
/// <returns>max <i>count</i> authors</returns> /// <returns>max <i>count</i> authors</returns>
Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthorsByName(string substring, int index, int count, string sort = ""); Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthorsByName(
string substring,
int index,
int count,
string sort = ""
);
} }

@ -5,15 +5,15 @@ using System.Globalization;
namespace JsonReader namespace JsonReader
{ {
public static class AuthorJsonReader public static class AuthorJsonReader
{ {
public static AuthorDTO ReadAuthor(string json) public static AuthorDTO ReadAuthor(string json)
{ {
JObject o = JObject.Parse(json); JObject o = JObject.Parse(json);
string bioTokenAsString = null; string bioTokenAsString = null;
if(o.TryGetValue("bio", out JToken? bioToken)) if (o.TryGetValue("bio", out JToken? bioToken))
{ {
if(bioToken.Type == JTokenType.String) if (bioToken.Type == JTokenType.String)
{ {
bioTokenAsString = (string)bioToken; bioTokenAsString = (string)bioToken;
} }
@ -29,19 +29,32 @@ namespace JsonReader
Id = (string)o["key"], Id = (string)o["key"],
Name = (string)o["name"], Name = (string)o["name"],
Bio = bioTokenAsString, Bio = bioTokenAsString,
BirthDate = o.TryGetValue("birth_date", out JToken? bd) ? ReadDate((string)o["birth_date"]) : null, BirthDate = o.TryGetValue("birth_date", out JToken? bd)
DeathDate = o.TryGetValue("death_date", out JToken? dd) ? ReadDate((string)o["death_date"]) : null, ? ReadDate((string)o["birth_date"])
Links = o.TryGetValue("links", out JToken? links) ? links.Select(l => new LinkDTO { Title = (string)l["title"], Url = (string)l["url"] }).ToList() : new List<LinkDTO>(), : null,
AlternateNames = o.TryGetValue("alternate_names", out JToken? altNames) ? altNames.Select(alt => (string)alt).ToList() : new List<string?>() DeathDate = o.TryGetValue("death_date", out JToken? dd)
? ReadDate((string)o["death_date"])
: null,
Links = o.TryGetValue("links", out JToken? links)
? links
.Select(
l => new LinkDTO { Title = (string)l["title"], Url = (string)l["url"] }
)
.ToList()
: new List<LinkDTO>(),
AlternateNames = o.TryGetValue("alternate_names", out JToken? altNames)
? altNames.Select(alt => (string)alt).ToList()
: new List<string?>()
}; };
return author; return author;
} }
public static DateTime? ReadDate(string dateInJson) public static DateTime? ReadDate(string dateInJson)
{ {
if(dateInJson == null) return null; if (dateInJson == null)
return null;
List<Tuple<string, CultureInfo>> pubDateFormat =new List<Tuple<string, CultureInfo>>() List<Tuple<string, CultureInfo>> pubDateFormat = new List<Tuple<string, CultureInfo>>()
{ {
Tuple.Create("d MMMM yyyy", CultureInfo.GetCultureInfo("fr-FR")), Tuple.Create("d MMMM yyyy", CultureInfo.GetCultureInfo("fr-FR")),
Tuple.Create("d MMMM yyyy", CultureInfo.InvariantCulture), Tuple.Create("d MMMM yyyy", CultureInfo.InvariantCulture),
@ -49,15 +62,23 @@ namespace JsonReader
}; };
DateTime? publishDate = null; DateTime? publishDate = null;
foreach(var format in pubDateFormat) foreach (var format in pubDateFormat)
{ {
if(DateTime.TryParseExact(dateInJson, format.Item1, format.Item2, DateTimeStyles.None, out DateTime readDate)) if (
DateTime.TryParseExact(
dateInJson,
format.Item1,
format.Item2,
DateTimeStyles.None,
out DateTime readDate
)
)
{ {
publishDate = readDate; publishDate = readDate;
break; break;
} }
} }
if(!publishDate.HasValue && int.TryParse(dateInJson, out int year)) if (!publishDate.HasValue && int.TryParse(dateInJson, out int year))
{ {
publishDate = new DateTime(year, 12, 31); publishDate = new DateTime(year, 12, 31);
} }
@ -68,13 +89,15 @@ namespace JsonReader
{ {
JObject o = JObject.Parse(json); JObject o = JObject.Parse(json);
long numFound = (long)o["numFound"]; long numFound = (long)o["numFound"];
var authors = o["docs"].Select(doc => new AuthorDTO var authors = o["docs"].Select(
{ doc =>
Id = $"/authors/{(string)doc["key"]}", new AuthorDTO
Name = (string)doc["name"], {
}); Id = $"/authors/{(string)doc["key"]}",
Name = (string)doc["name"],
}
);
return Tuple.Create(numFound, authors); return Tuple.Create(numFound, authors);
} }
} }
} }

@ -1,97 +1,117 @@
using System.Globalization; using System.Globalization;
using LibraryDTO; using LibraryDTO;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace JsonReader; namespace JsonReader;
public static class BookJsonReader public static class BookJsonReader
{ {
static Dictionary<string, Languages> languages = new Dictionary<string, Languages>() static Dictionary<string, Languages> languages = new Dictionary<string, Languages>()
{ {
[@"/languages/fre"] = Languages.French, [@"/languages/fre"] = Languages.French,
[@"/languages/eng"] = Languages.English, [@"/languages/eng"] = Languages.English,
["fre"] = Languages.French, ["fre"] = Languages.French,
["eng"] = Languages.English, ["eng"] = Languages.English,
[""] = Languages.Unknown [""] = Languages.Unknown
}; };
public static BookDTO ReadBook(string json) public static BookDTO ReadBook(string json)
{ {
JObject o = JObject.Parse(json); JObject o = JObject.Parse(json);
var l = o["languages"]?.FirstOrDefault(""); var l = o["languages"]?.FirstOrDefault("");
Languages lang = l != null ? languages[(string)l["key"]] : Languages.Unknown; Languages lang = l != null ? languages[(string)l["key"]] : Languages.Unknown;
//List<Tuple<string, CultureInfo>> pubDateFormat =new List<Tuple<string, CultureInfo>>() //List<Tuple<string, CultureInfo>> pubDateFormat =new List<Tuple<string, CultureInfo>>()
//{ //{
// Tuple.Create("d MMMM yyyy", CultureInfo.GetCultureInfo("fr-FR")), // Tuple.Create("d MMMM yyyy", CultureInfo.GetCultureInfo("fr-FR")),
// Tuple.Create("MMM dd, yyyy", CultureInfo.InvariantCulture) // Tuple.Create("MMM dd, yyyy", CultureInfo.InvariantCulture)
//}; //};
//DateTime? publishDate = null; //DateTime? publishDate = null;
//foreach(var format in pubDateFormat) //foreach(var format in pubDateFormat)
//{ //{
// if(DateTime.TryParseExact((string)o["publish_date"], format.Item1, format.Item2, DateTimeStyles.None, out DateTime readDate)) // if(DateTime.TryParseExact((string)o["publish_date"], format.Item1, format.Item2, DateTimeStyles.None, out DateTime readDate))
// { // {
// publishDate = readDate; // publishDate = readDate;
// break; // break;
// } // }
//} //}
//if(!publishDate.HasValue) //if(!publishDate.HasValue)
//{ //{
// publishDate = new DateTime((int)o["publish_date"], 12, 31); // publishDate = new DateTime((int)o["publish_date"], 12, 31);
//} //}
DateTime? publishDate = AuthorJsonReader.ReadDate((string)o["publish_date"]); DateTime? publishDate = AuthorJsonReader.ReadDate((string)o["publish_date"]);
BookDTO book = new BookDTO BookDTO book = new BookDTO
{ {
Id = (string)o["key"], Id = (string)o["key"],
Title = (string)o["title"], Title = (string)o["title"],
Publishers = o["publishers"].Select(p => (string)p).ToList(), Publishers = o["publishers"].Select(p => (string)p).ToList(),
PublishDate = publishDate.GetValueOrDefault(DateTime.Now), PublishDate = publishDate.GetValueOrDefault(DateTime.Now),
ISBN13 = (string)o["isbn_13"][0], ISBN13 = (string)o["isbn_13"][0],
NbPages = o["number_of_pages"] != null ? (int)o["number_of_pages"] : -1, NbPages = o["number_of_pages"] != null ? (int)o["number_of_pages"] : -1,
Language = lang, Language = lang,
Format = o.TryGetValue("physical_format", out JToken? f) ? (string)f : null, Format = o.TryGetValue("physical_format", out JToken? f) ? (string)f : null,
Works = o["works"].Select(w => new WorkDTO { Id = (string)w["key"] }).ToList(), Works = o["works"].Select(w => new WorkDTO { Id = (string)w["key"] }).ToList(),
Contributors = o.TryGetValue("contributors", out JToken? contr) ? contr.Select(c => new ContributorDTO { Name = (string)c["name"], Role = (string)c["role"] }).ToList() : new List<ContributorDTO>(), Contributors = o.TryGetValue("contributors", out JToken? contr)
Authors = o["authors"]?.Select(a => new AuthorDTO { Id = (string)a["key"] }).ToList() ? contr
}; .Select(
if(book.Authors == null) c =>
{ new ContributorDTO
book.Authors = new List<AuthorDTO>(); {
} Name = (string)c["name"],
return book; Role = (string)c["role"]
} }
)
public static Tuple<long, IEnumerable<BookDTO>> GetBooksByAuthor(string json) .ToList()
{ : new List<ContributorDTO>(),
JObject o = JObject.Parse(json); Authors = o["authors"]?.Select(a => new AuthorDTO { Id = (string)a["key"] }).ToList()
long numFound = (long)o["numFound"]; };
var books = o["docs"].Select(doc => new BookDTO if (book.Authors == null)
{ {
Id = (string)(doc["seed"].First()), book.Authors = new List<AuthorDTO>();
Title = (string)doc["title"], }
ISBN13 = (string)(doc["isbn"].First()), return book;
Authors = doc["seed"].Where(s => ((string)s).StartsWith("/authors/")) }
.Select(s => new AuthorDTO { Id = (string)s }).ToList(),
Language = languages.GetValueOrDefault((string)(doc["language"].First())) public static Tuple<long, IEnumerable<BookDTO>> GetBooksByAuthor(string json)
}); {
return Tuple.Create(numFound, books); JObject o = JObject.Parse(json);
} long numFound = (long)o["numFound"];
var books = o["docs"].Select(
public static Tuple<long, IEnumerable<BookDTO>> GetBooksByTitle(string json) doc =>
{ new BookDTO
JObject o = JObject.Parse(json); {
long numFound = (long)o["numFound"]; Id = (string)(doc["seed"].First()),
var books = o["docs"].Select(doc => new BookDTO Title = (string)doc["title"],
{ ISBN13 = (string)(doc["isbn"].First()),
Id = (string)(doc["seed"].First()), Authors = doc["seed"]
Title = (string)doc["title"], .Where(s => ((string)s).StartsWith("/authors/"))
ISBN13 = (string)(doc["isbn"].First()), .Select(s => new AuthorDTO { Id = (string)s })
Authors = doc["seed"].Where(s => ((string)s).StartsWith("/authors/")) .ToList(),
.Select(s => new AuthorDTO { Id = (string)s }).ToList(), Language = languages.GetValueOrDefault((string)(doc["language"].First()))
Language = languages.GetValueOrDefault((string)(doc["language"].First())) }
}); );
return Tuple.Create(numFound, books); return Tuple.Create(numFound, books);
} }
}
public static Tuple<long, IEnumerable<BookDTO>> GetBooksByTitle(string json)
{
JObject o = JObject.Parse(json);
long numFound = (long)o["numFound"];
var books = o["docs"].Select(
doc =>
new BookDTO
{
Id = (string)(doc["seed"].First()),
Title = (string)doc["title"],
ISBN13 = (string)(doc["isbn"].First()),
Authors = doc["seed"]
.Where(s => ((string)s).StartsWith("/authors/"))
.Select(s => new AuthorDTO { Id = (string)s })
.ToList(),
Language = languages.GetValueOrDefault((string)(doc["language"].First()))
}
);
return Tuple.Create(numFound, books);
}
}

@ -5,14 +5,14 @@ using System.Globalization;
namespace JsonReader namespace JsonReader
{ {
public static class WorkJsonReader public static class WorkJsonReader
{ {
public static WorkDTO ReadWork(string json, string ratingsJson) public static WorkDTO ReadWork(string json, string ratingsJson)
{ {
JObject o = JObject.Parse(json); JObject o = JObject.Parse(json);
JObject r = JObject.Parse(ratingsJson); JObject r = JObject.Parse(ratingsJson);
var ratingsDto = new RatingsDTO(); var ratingsDto = new RatingsDTO();
if(r["summary"]["average"].Type != JTokenType.Float) if (r["summary"]["average"].Type != JTokenType.Float)
{ {
ratingsDto.Average = -1; ratingsDto.Average = -1;
ratingsDto.Count = 0; ratingsDto.Count = 0;
@ -24,9 +24,9 @@ namespace JsonReader
} }
string description = null; string description = null;
if(o.TryGetValue("description", out JToken? descr)) if (o.TryGetValue("description", out JToken? descr))
{ {
if(descr.Type == JTokenType.String) if (descr.Type == JTokenType.String)
{ {
description = (string)descr; description = (string)descr;
} }
@ -43,13 +43,18 @@ namespace JsonReader
{ {
Id = (string)o["key"], Id = (string)o["key"],
Title = (string)o["title"], Title = (string)o["title"],
Authors = o.TryGetValue("authors", out JToken? authors) ? authors.Select(a => new AuthorDTO { Id = (string)a["author"]["key"] }).ToList() : new List<AuthorDTO>(), Authors = o.TryGetValue("authors", out JToken? authors)
? authors
.Select(a => new AuthorDTO { Id = (string)a["author"]["key"] })
.ToList()
: new List<AuthorDTO>(),
Description = description, Description = description,
Subjects = o.TryGetValue("subjects", out JToken? subjects) ? subjects.Select(s => (string)s).ToList() : new List<string>(), Subjects = o.TryGetValue("subjects", out JToken? subjects)
? subjects.Select(s => (string)s).ToList()
: new List<string>(),
Ratings = ratingsDto Ratings = ratingsDto
}; };
return work; return work;
} }
} }
} }

@ -1,18 +1,21 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class AuthorDTO public class AuthorDTO
{ {
public string Id { get; set; } public string Id { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string ImageSmall => $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-S.jpg"; public string ImageSmall =>
public string ImageMedium => $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-M.jpg"; $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-S.jpg";
public string ImageLarge => $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-L.jpg"; public string ImageMedium =>
public string Bio { get; set; } $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-M.jpg";
public List<string> AlternateNames { get; set; } = new List<string>(); public string ImageLarge =>
public List<LinkDTO> Links { get; set; } $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-L.jpg";
public DateTime? BirthDate { get; set; } public string Bio { get; set; }
public DateTime? DeathDate { get; set; } public List<string> AlternateNames { get; set; } = new List<string>();
} public List<LinkDTO> Links { get; set; }
public DateTime? BirthDate { get; set; }
public DateTime? DeathDate { get; set; }
}
} }

@ -1,23 +1,23 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class BookDTO public class BookDTO
{ {
public string Id { get; set; } public string Id { get; set; }
public string Title { get; set; } public string Title { get; set; }
public List<string> Publishers { get; set; } = new List<string>(); public List<string> Publishers { get; set; } = new List<string>();
public DateTime PublishDate { get; set; } public DateTime PublishDate { get; set; }
public string ISBN13 { get; set; } public string ISBN13 { get; set; }
public List<string> Series { get; set; } = new List<string>(); public List<string> Series { get; set; } = new List<string>();
public int NbPages { get; set; } public int NbPages { get; set; }
public string Format { get; set; } public string Format { get; set; }
public Languages Language { get; set; } public Languages Language { get; set; }
public List<ContributorDTO> Contributors { get; set; } public List<ContributorDTO> Contributors { get; set; }
public string ImageSmall => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-S.jpg"; public string ImageSmall => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-S.jpg";
public string ImageMedium => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-M.jpg"; public string ImageMedium => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-M.jpg";
public string ImageLarge => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-L.jpg"; public string ImageLarge => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-L.jpg";
public List<WorkDTO> Works { get; set; } = new List<WorkDTO>(); public List<WorkDTO> Works { get; set; } = new List<WorkDTO>();
public List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>(); public List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>();
} }
} }

@ -1,10 +1,10 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class ContributorDTO public class ContributorDTO
{ {
public string Name { get; set; } public string Name { get; set; }
public string Role { get; set; } public string Role { get; set; }
} }
} }

@ -1,11 +1,11 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public enum Languages public enum Languages
{ {
Unknown, Unknown,
French, French,
English English
} }
} }

@ -1,10 +1,10 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class LinkDTO public class LinkDTO
{ {
public string Title { get; set; } public string Title { get; set; }
public string Url { get; set; } public string Url { get; set; }
} }
} }

@ -1,10 +1,10 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class RatingsDTO public class RatingsDTO
{ {
public float Average { get; set; } public float Average { get; set; }
public int Count { get; set; } public int Count { get; set; }
} }
} }

@ -1,14 +1,14 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class WorkDTO public class WorkDTO
{ {
public string Id { get; set; } public string Id { get; set; }
public string Description { get; set; } public string Description { get; set; }
public string Title { get; set; } public string Title { get; set; }
public List<string> Subjects { get; set; } = new List<string>(); public List<string> Subjects { get; set; } = new List<string>();
public List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>(); public List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>();
public RatingsDTO Ratings { get; set; } public RatingsDTO Ratings { get; set; }
} }
} }

@ -1,32 +1,36 @@
using System; using System;
namespace Model namespace Model
{ {
public class Author : IEquatable<Author> public class Author : IEquatable<Author>
{ {
public string Id { get; set; } public string Id { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string ImageSmall => $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-S.jpg"; public string ImageSmall =>
public string ImageMedium => $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-M.jpg"; $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-S.jpg";
public string ImageLarge => $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-L.jpg"; public string ImageMedium =>
public string Bio { get; set; } $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-M.jpg";
public List<string> AlternateNames { get; set; } = new List<string>(); public string ImageLarge =>
public List<Link> Links { get; set; } $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-L.jpg";
public DateTime? BirthDate { get; set; } public string Bio { get; set; }
public DateTime? DeathDate { get; set; } public List<string> AlternateNames { get; set; } = new List<string>();
public List<Link> Links { get; set; }
public DateTime? BirthDate { get; set; }
public DateTime? DeathDate { get; set; }
public bool Equals(Author? other) public bool Equals(Author? other) => Id == other.Id;
=> Id == other.Id;
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if(ReferenceEquals(obj, null)) return false; if (ReferenceEquals(obj, null))
if(ReferenceEquals(this, obj)) return true; return false;
if(GetType() != obj.GetType()) return false; if (ReferenceEquals(this, obj))
return Equals(obj as Author); return true;
} if (GetType() != obj.GetType())
return false;
return Equals(obj as Author);
}
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode(); }
}
} }

@ -4,38 +4,38 @@ namespace Model;
public class Book : IEquatable<Book> public class Book : IEquatable<Book>
{ {
public string Id { get; set; } public string Id { get; set; }
public string Title { get; set; } public string Title { get; set; }
public List<string> Publishers { get; set; } = new List<string>(); public List<string> Publishers { get; set; } = new List<string>();
public DateTime PublishDate { get; set; } public DateTime PublishDate { get; set; }
public string ISBN13 { get; set; } public string ISBN13 { get; set; }
public List<string> Series { get; set; } = new List<string>(); public List<string> Series { get; set; } = new List<string>();
public int NbPages { get; set; } public int NbPages { get; set; }
public string Format { get; set; } public string Format { get; set; }
public Languages Language { get; set; } public Languages Language { get; set; }
public List<Contributor> Contributors { get; set; } public List<Contributor> Contributors { get; set; }
public string ImageSmall => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-S.jpg"; public string ImageSmall => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-S.jpg";
public string ImageMedium => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-M.jpg"; public string ImageMedium => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-M.jpg";
public string ImageLarge => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-L.jpg"; public string ImageLarge => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-L.jpg";
public List<Work> Works { get; set; } = new List<Work>(); public List<Work> Works { get; set; } = new List<Work>();
public List<Author> Authors { get; set; } = new List<Author>(); public List<Author> Authors { get; set; } = new List<Author>();
public Status Status { get; set; } public Status Status { get; set; }
public List<string> UserTags { get; set; } = new List<string>(); public List<string> UserTags { get; set; } = new List<string>();
public float? UserRating { get; set; } public float? UserRating { get; set; }
public string UserNote { get; set; } public string UserNote { get; set; }
public bool Equals(Book? other) public bool Equals(Book? other) => Id == other.Id;
=> Id == other.Id;
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if(ReferenceEquals(obj, null)) return false; if (ReferenceEquals(obj, null))
if(ReferenceEquals(this, obj)) return true; return false;
if(GetType() != obj.GetType()) return false; if (ReferenceEquals(this, obj))
return true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Book); return Equals(obj as Book);
} }
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode();
} }

@ -3,27 +3,27 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Model namespace Model
{ {
public class Borrowing : IEquatable<Borrowing> //emprunt public class Borrowing : IEquatable<Borrowing> //emprunt
{ {
public string Id { get; set; } public string Id { get; set; }
public Book Book { get; set; } public Book Book { get; set; }
public Contact Owner { get; set; } public Contact Owner { get; set; }
public DateTime BorrowedAt { get; set; } public DateTime BorrowedAt { get; set; }
public DateTime? ReturnedAt { get; set; } public DateTime? ReturnedAt { get; set; }
public bool Equals(Borrowing? other) public bool Equals(Borrowing? other) => Id == other.Id;
=> Id == other.Id;
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if(ReferenceEquals(obj, null)) return false; if (ReferenceEquals(obj, null))
if(ReferenceEquals(this, obj)) return true; return false;
if(GetType() != obj.GetType()) return false; if (ReferenceEquals(this, obj))
return Equals(obj as Borrowing); return true;
} if (GetType() != obj.GetType())
return false;
return Equals(obj as Borrowing);
}
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode(); }
}
} }

@ -1,25 +1,26 @@
using System; using System;
namespace Model namespace Model
{ {
public class Contact : IEquatable<Contact> public class Contact : IEquatable<Contact>
{ {
public string Id { get; set; } public string Id { get; set; }
public string FirstName { get; set; } public string FirstName { get; set; }
public string LastName { get; set; } public string LastName { get; set; }
public bool Equals(Contact? other) public bool Equals(Contact? other) => Id == other.Id;
=> Id == other.Id;
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if(ReferenceEquals(obj, null)) return false; if (ReferenceEquals(obj, null))
if(ReferenceEquals(this, obj)) return true; return false;
if(GetType() != obj.GetType()) return false; if (ReferenceEquals(this, obj))
return Equals(obj as Contact); return true;
} if (GetType() != obj.GetType())
return false;
return Equals(obj as Contact);
}
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode(); }
}
} }

@ -1,10 +1,10 @@
using System; using System;
namespace Model namespace Model
{ {
public class Contributor public class Contributor
{ {
public string Name { get; set; } public string Name { get; set; }
public string Role { get; set; } public string Role { get; set; }
} }
} }

@ -1,15 +1,35 @@
using System; using System;
namespace Model namespace Model
{ {
public interface ILibraryManager public interface ILibraryManager
{ {
Task<Book> GetBookById(string id); Task<Book> GetBookById(string id);
Task<Book> GetBookByISBN(string isbn); Task<Book> GetBookByISBN(string isbn);
Task<Tuple<long, IEnumerable<Book>>> GetBooksByTitle(string title, int index, int count, string sort = ""); Task<Tuple<long, IEnumerable<Book>>> GetBooksByTitle(
Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthorId(string authorId, int index, int count, string sort = ""); string title,
Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthor(string author, int index, int count, string sort = ""); int index,
int count,
string sort = ""
);
Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthorId(
string authorId,
int index,
int count,
string sort = ""
);
Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthor(
string author,
int index,
int count,
string sort = ""
);
Task<Author> GetAuthorById(string id); Task<Author> GetAuthorById(string id);
Task<Tuple<long, IEnumerable<Author>>> GetAuthorsByName(string substring, int index, int count, string sort = ""); Task<Tuple<long, IEnumerable<Author>>> GetAuthorsByName(
} string substring,
int index,
int count,
string sort = ""
);
}
} }

@ -1,40 +1,43 @@
using System; using System;
namespace Model namespace Model
{ {
public interface IUserLibraryManager : ILibraryManager public interface IUserLibraryManager : ILibraryManager
{ {
Task<Tuple<long, IEnumerable<Book>>> GetBooksFromCollection(int index, int count, string sort = ""); Task<Tuple<long, IEnumerable<Book>>> GetBooksFromCollection(
int index,
Task<Book> AddBook(Book book); int count,
Task<Book> AddBook(string id); string sort = ""
Task<Book> AddBookByIsbn(string isbn); );
Task<bool> RemoveBook(Book book);
Task<bool> RemoveBook(string id); Task<Book> AddBook(Book book);
Task<bool> RemoveBookByIsbn(string isbn); Task<Book> AddBook(string id);
Task<Book> AddBookByIsbn(string isbn);
Task<bool> AddToFavorites(Book book); Task<bool> RemoveBook(Book book);
Task<bool> AddToFavorites(string bookId); Task<bool> RemoveBook(string id);
Task<bool> RemoveFromFavorites(Book book); Task<bool> RemoveBookByIsbn(string isbn);
Task<bool> RemoveFromFavorites(string bookId);
Task<bool> AddToFavorites(Book book);
Task<Book> UpdateBook(Book updatedBook); Task<bool> AddToFavorites(string bookId);
Task<bool> RemoveFromFavorites(Book book);
Task<Contact> AddContact(Contact contact); Task<bool> RemoveFromFavorites(string bookId);
Task<bool> RemoveContact(Contact contact);
Task<Book> UpdateBook(Book updatedBook);
Task<bool> LendBook(Book book, Contact contact, DateTime? loanDate);
Task<bool> GetBackBook(Book book, DateTime? returnedDate); Task<Contact> AddContact(Contact contact);
Task<bool> BorrowBook(Book book, Contact owner, DateTime? borrowedDate); Task<bool> RemoveContact(Contact contact);
Task<bool> GiveBackBook(Book book, DateTime? returnedDate);
Task<bool> LendBook(Book book, Contact contact, DateTime? loanDate);
Task<bool> GetBackBook(Book book, DateTime? returnedDate);
Task<bool> BorrowBook(Book book, Contact owner, DateTime? borrowedDate);
Task<bool> GiveBackBook(Book book, DateTime? returnedDate);
Task<Tuple<long, IEnumerable<Loan>>> GetCurrentLoans(int index, int count); Task<Tuple<long, IEnumerable<Loan>>> GetCurrentLoans(int index, int count);
Task<Tuple<long, IEnumerable<Loan>>> GetPastLoans(int index, int count); Task<Tuple<long, IEnumerable<Loan>>> GetPastLoans(int index, int count);
Task<Tuple<long, IEnumerable<Borrowing>>> GetCurrentBorrowings(int index, int count); Task<Tuple<long, IEnumerable<Borrowing>>> GetCurrentBorrowings(int index, int count);
Task<Tuple<long, IEnumerable<Borrowing>>> GetPastBorrowings(int index, int count); Task<Tuple<long, IEnumerable<Borrowing>>> GetPastBorrowings(int index, int count);
Task<Tuple<long, IEnumerable<Contact>>> GetContacts(int index, int count); Task<Tuple<long, IEnumerable<Contact>>> GetContacts(int index, int count);
}
}
} }

@ -1,11 +1,11 @@
using System; using System;
namespace Model namespace Model
{ {
public enum Languages public enum Languages
{ {
Unknown, Unknown,
French, French,
English English
} }
} }

@ -1,10 +1,10 @@
using System; using System;
namespace Model namespace Model
{ {
public class Link public class Link
{ {
public string Title { get; set; } public string Title { get; set; }
public string Url { get; set; } public string Url { get; set; }
} }
} }

@ -1,27 +1,28 @@
using System; using System;
namespace Model namespace Model
{ {
public class Loan : IEquatable<Loan> //prêt public class Loan : IEquatable<Loan> //prêt
{ {
public string Id { get; set; } public string Id { get; set; }
public Book Book { get; set; } public Book Book { get; set; }
public Contact Loaner { get; set; } public Contact Loaner { get; set; }
public DateTime LoanedAt { get; set; } public DateTime LoanedAt { get; set; }
public DateTime? ReturnedAt { get; set; } public DateTime? ReturnedAt { get; set; }
public bool Equals(Loan? other) public bool Equals(Loan? other) => Id == other.Id;
=> Id == other.Id;
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if(ReferenceEquals(obj, null)) return false; if (ReferenceEquals(obj, null))
if(ReferenceEquals(this, obj)) return true; return false;
if(GetType() != obj.GetType()) return false; if (ReferenceEquals(this, obj))
return Equals(obj as Loan); return true;
} if (GetType() != obj.GetType())
return false;
return Equals(obj as Loan);
}
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode(); }
}
} }

@ -4,103 +4,130 @@ using System.Reflection;
namespace Model namespace Model
{ {
public class Manager public class Manager
{ {
private ILibraryManager LibraryManager { get; set; } private ILibraryManager LibraryManager { get; set; }
private IUserLibraryManager UserLibraryManager { get; set; } private IUserLibraryManager UserLibraryManager { get; set; }
public ReadOnlyCollection<Book> Books { get; private set; } public ReadOnlyCollection<Book> Books { get; private set; }
private List<Book> books = new(); private List<Book> books = new();
public Manager(ILibraryManager libMgr, IUserLibraryManager userLibMgr) public Manager(ILibraryManager libMgr, IUserLibraryManager userLibMgr)
{ {
LibraryManager = libMgr; LibraryManager = libMgr;
UserLibraryManager = userLibMgr; UserLibraryManager = userLibMgr;
Books = new ReadOnlyCollection<Book>(books); Books = new ReadOnlyCollection<Book>(books);
} }
public async Task<Book> GetBookById(string id) public async Task<Book> GetBookById(string id) => await LibraryManager.GetBookById(id);
=> await LibraryManager.GetBookById(id);
public async Task<Book> GetBookByISBN(string isbn) =>
public async Task<Book> GetBookByISBN(string isbn) await LibraryManager.GetBookByISBN(isbn);
=> await LibraryManager.GetBookByISBN(isbn);
public async Task<(long count, IEnumerable<Book> books)> GetBooksByTitle(
public async Task<(long count, IEnumerable<Book> books)> GetBooksByTitle(string title, int index, int count, string sort = "") string title,
{ int index,
var result = await LibraryManager.GetBooksByTitle(title, index, count, sort); int count,
return (result.Item1, result.Item2); string sort = ""
} )
{
public async Task<(long count, IEnumerable<Book> books)> GetBooksByAuthorId(string authorId, int index, int count, string sort = "") var result = await LibraryManager.GetBooksByTitle(title, index, count, sort);
{ return (result.Item1, result.Item2);
var result = await LibraryManager.GetBooksByAuthorId(authorId, index, count, sort); }
return (result.Item1, result.Item2);
} public async Task<(long count, IEnumerable<Book> books)> GetBooksByAuthorId(
string authorId,
public async Task<(long count, IEnumerable<Book> books)> GetBooksByAuthor(string author, int index, int count, string sort = "") int index,
{ int count,
var result = await LibraryManager.GetBooksByAuthor(author, index, count, sort); string sort = ""
return (result.Item1, result.Item2); )
} {
var result = await LibraryManager.GetBooksByAuthorId(authorId, index, count, sort);
public async Task<Author> GetAuthorById(string id) return (result.Item1, result.Item2);
=> await LibraryManager.GetAuthorById(id); }
public async Task<(long count, IEnumerable<Author> authors)> GetAuthorsByName(string substring, int index, int count, string sort = "") public async Task<(long count, IEnumerable<Book> books)> GetBooksByAuthor(
{ string author,
var result = await LibraryManager.GetAuthorsByName(substring, index, count, sort); int index,
return (result.Item1, result.Item2); int count,
} string sort = ""
)
public Task<Book> AddBookToCollection(string id) {
{ var result = await LibraryManager.GetBooksByAuthor(author, index, count, sort);
return UserLibraryManager.AddBook(id); return (result.Item1, result.Item2);
} }
public async Task<Book> GetBookByIdFromCollection(string id) public async Task<Author> GetAuthorById(string id) =>
=> await UserLibraryManager.GetBookById(id); await LibraryManager.GetAuthorById(id);
public async Task<(long count, IEnumerable<Author> authors)> GetAuthorsByName(
public Task<Book> UpdateBook(Book book) string substring,
{ int index,
return UserLibraryManager.UpdateBook(book); int count,
} string sort = ""
)
public Task<(long count, IEnumerable<Book> books)> GetBooksFromCollection(int index, int count, string sort = "") {
{ var result = await LibraryManager.GetAuthorsByName(substring, index, count, sort);
var result = UserLibraryManager.GetBooksFromCollection(index, count, sort).Result; return (result.Item1, result.Item2);
return Task.FromResult((result.Item1, result.Item2)); }
}
public Task<Book> AddBookToCollection(string id)
public Task<(long count, IEnumerable<Contact> contacts)> GetContacts(int index, int count) {
{ return UserLibraryManager.AddBook(id);
var result = UserLibraryManager.GetContacts(index, count).Result; }
return Task.FromResult((result.Item1, result.Item2));
} public async Task<Book> GetBookByIdFromCollection(string id) =>
await UserLibraryManager.GetBookById(id);
public Task<(long count, IEnumerable<Loan> loans)> GetCurrentLoans(int index, int count)
{ public Task<Book> UpdateBook(Book book)
var result = UserLibraryManager.GetCurrentLoans(index, count).Result; {
return Task.FromResult((result.Item1, result.Item2)); return UserLibraryManager.UpdateBook(book);
} }
public Task<(long count, IEnumerable<Loan> loans)> GetPastLoans(int index, int count) public Task<(long count, IEnumerable<Book> books)> GetBooksFromCollection(
{ int index,
var result = UserLibraryManager.GetPastLoans(index, count).Result; int count,
return Task.FromResult((result.Item1, result.Item2)); string sort = ""
} )
{
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetCurrentBorrowings(int index, int count) var result = UserLibraryManager.GetBooksFromCollection(index, count, sort).Result;
{ return Task.FromResult((result.Item1, result.Item2));
var result = UserLibraryManager.GetCurrentBorrowings(index, count).Result; }
return Task.FromResult((result.Item1, result.Item2));
} public Task<(long count, IEnumerable<Contact> contacts)> GetContacts(int index, int count)
{
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetPastBorrowings(int index, int count) var result = UserLibraryManager.GetContacts(index, count).Result;
{ return Task.FromResult((result.Item1, result.Item2));
var result = UserLibraryManager.GetPastBorrowings(index, count).Result; }
return Task.FromResult((result.Item1, result.Item2));
} public Task<(long count, IEnumerable<Loan> loans)> GetCurrentLoans(int index, int count)
} {
var result = UserLibraryManager.GetCurrentLoans(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Loan> loans)> GetPastLoans(int index, int count)
{
var result = UserLibraryManager.GetPastLoans(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetCurrentBorrowings(
int index,
int count
)
{
var result = UserLibraryManager.GetCurrentBorrowings(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetPastBorrowings(
int index,
int count
)
{
var result = UserLibraryManager.GetPastBorrowings(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
}
} }

@ -1,10 +1,10 @@
using System; using System;
namespace Model namespace Model
{ {
public class Person public class Person
{ {
public string Id { get; set; } public string Id { get; set; }
public string Name { get; set; } public string Name { get; set; }
} }
} }

@ -1,10 +1,10 @@
using System; using System;
namespace Model namespace Model
{ {
public class Ratings public class Ratings
{ {
public float Average { get; set; } public float Average { get; set; }
public int Count { get; set; } public int Count { get; set; }
} }
} }

@ -1,13 +1,13 @@
using System; using System;
namespace Model namespace Model
{ {
public enum Status public enum Status
{ {
Unknown, Unknown,
Finished, Finished,
Reading, Reading,
NotRead, NotRead,
ToBeRead ToBeRead
} }
} }

@ -1,28 +1,29 @@
using System; using System;
namespace Model namespace Model
{ {
public class Work : IEquatable<Work> public class Work : IEquatable<Work>
{ {
public string Id { get; set; } public string Id { get; set; }
public string Description { get; set; } public string Description { get; set; }
public string Title { get; set; } public string Title { get; set; }
public List<string> Subjects { get; set; } = new List<string>(); public List<string> Subjects { get; set; } = new List<string>();
public List<Author> Authors { get; set; } = new List<Author>(); public List<Author> Authors { get; set; } = new List<Author>();
public Ratings Ratings { get; set; } public Ratings Ratings { get; set; }
public bool Equals(Work? other) public bool Equals(Work? other) => Id == other.Id;
=> Id == other.Id;
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if(ReferenceEquals(obj, null)) return false; if (ReferenceEquals(obj, null))
if(ReferenceEquals(this, obj)) return true; return false;
if(GetType() != obj.GetType()) return false; if (ReferenceEquals(this, obj))
return Equals(obj as Work); return true;
} if (GetType() != obj.GetType())
return false;
return Equals(obj as Work);
}
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode(); }
}
} }

@ -3,21 +3,22 @@ using Utils;
namespace Stub namespace Stub
{ {
static class EnumsMapper static class EnumsMapper
{ {
public static EnumsMapper<Model.Languages, LibraryDTO.Languages> BiddingsMapper { get; } public static EnumsMapper<Model.Languages, LibraryDTO.Languages> BiddingsMapper { get; } =
= new EnumsMapper<Model.Languages, LibraryDTO.Languages>( new EnumsMapper<Model.Languages, LibraryDTO.Languages>(
Tuple.Create(Model.Languages.Unknown, LibraryDTO.Languages.Unknown), Tuple.Create(Model.Languages.Unknown, LibraryDTO.Languages.Unknown),
Tuple.Create(Model.Languages.French, LibraryDTO.Languages.French), Tuple.Create(Model.Languages.French, LibraryDTO.Languages.French),
Tuple.Create(Model.Languages.English, LibraryDTO.Languages.English) Tuple.Create(Model.Languages.English, LibraryDTO.Languages.English)
); );
public static TModel ToModel<TModel, TDTO>(this TDTO dto) where TModel : Enum public static TModel ToModel<TModel, TDTO>(this TDTO dto)
where TDTO : Enum where TModel : Enum
where TDTO : Enum
{ {
foreach(var prop in typeof(EnumsMapper).GetProperties()) foreach (var prop in typeof(EnumsMapper).GetProperties())
{ {
if(prop.PropertyType.Equals(typeof(EnumsMapper<TModel, TDTO>))) if (prop.PropertyType.Equals(typeof(EnumsMapper<TModel, TDTO>)))
{ {
return (prop.GetValue(null) as EnumsMapper<TModel, TDTO>).GetModel(dto); return (prop.GetValue(null) as EnumsMapper<TModel, TDTO>).GetModel(dto);
} }
@ -25,15 +26,16 @@ namespace Stub
return default(TModel); return default(TModel);
} }
public static Model.Languages ToModel(this LibraryDTO.Languages dto) public static Model.Languages ToModel(this LibraryDTO.Languages dto) =>
=> ToModel<Model.Languages, LibraryDTO.Languages>(dto); ToModel<Model.Languages, LibraryDTO.Languages>(dto);
public static TDTO ToDTO<TModel, TDTO>(this TModel model) where TModel : Enum public static TDTO ToDTO<TModel, TDTO>(this TModel model)
where TDTO : Enum where TModel : Enum
where TDTO : Enum
{ {
foreach(var prop in typeof(EnumsMapper).GetProperties()) foreach (var prop in typeof(EnumsMapper).GetProperties())
{ {
if(prop.PropertyType.Equals(typeof(EnumsMapper<TModel, TDTO>))) if (prop.PropertyType.Equals(typeof(EnumsMapper<TModel, TDTO>)))
{ {
return (prop.GetValue(null) as EnumsMapper<TModel, TDTO>).GetEntity(model); return (prop.GetValue(null) as EnumsMapper<TModel, TDTO>).GetEntity(model);
} }
@ -41,9 +43,7 @@ namespace Stub
return default(TDTO); return default(TDTO);
} }
public static LibraryDTO.Languages ToDTO(this Model.Languages model) public static LibraryDTO.Languages ToDTO(this Model.Languages model) =>
=> ToDTO<Model.Languages, LibraryDTO.Languages>(model); ToDTO<Model.Languages, LibraryDTO.Languages>(model);
} }
} }

@ -5,89 +5,94 @@ using static Stub.Mapper;
namespace Stub namespace Stub
{ {
public static class Extensions public static class Extensions
{ {
public static Ratings ToPoco(this RatingsDTO dto) public static Ratings ToPoco(this RatingsDTO dto) =>
=> new Ratings() { Average = dto.Average, Count = dto.Count }; new Ratings() { Average = dto.Average, Count = dto.Count };
public static IEnumerable<Ratings> ToPocos(this IEnumerable<RatingsDTO> dtos)
=> dtos.Select(dto => dto.ToPoco());
public static Contributor ToPoco(this ContributorDTO dto) public static IEnumerable<Ratings> ToPocos(this IEnumerable<RatingsDTO> dtos) =>
=> new Contributor { Name = dto.Name, Role = dto.Role }; dtos.Select(dto => dto.ToPoco());
public static IEnumerable<Contributor> ToPocos(this IEnumerable<ContributorDTO> dtos)
=> dtos.Select(dto => dto.ToPoco());
public static Link ToPoco(this LinkDTO dto) public static Contributor ToPoco(this ContributorDTO dto) =>
=> new Link { Title = dto.Title, Url = dto.Url }; new Contributor { Name = dto.Name, Role = dto.Role };
public static IEnumerable<Link> ToPocos(this IEnumerable<LinkDTO> dtos)
=> dtos.Select(dto => dto.ToPoco());
public static Author ToPoco(this AuthorDTO dto) public static IEnumerable<Contributor> ToPocos(this IEnumerable<ContributorDTO> dtos) =>
{ dtos.Select(dto => dto.ToPoco());
var result = AuthorsMapper.GetT(dto);
if(result == null)
{
result = new Author
{
AlternateNames = dto.AlternateNames,
Bio = dto.Bio,
BirthDate = dto.BirthDate,
DeathDate = dto.DeathDate,
Id = dto.Id,
Links = dto.Links.ToPocos().ToList(),
Name = dto.Name
};
}
return result;
}
public static IEnumerable<Author> ToPocos(this IEnumerable<AuthorDTO> dtos)
=> dtos.Select(dto => dto.ToPoco());
public static Work ToPoco(this WorkDTO dto) public static Link ToPoco(this LinkDTO dto) =>
{ new Link { Title = dto.Title, Url = dto.Url };
var result = WorksMapper.GetT(dto);
if(result == null)
{
result = new Work
{
Authors = dto.Authors.ToPocos().ToList(),
Description = dto.Description,
Id = dto.Id,
Ratings = dto.Ratings.ToPoco(),
Subjects = dto.Subjects,
Title = dto.Title
};
}
return result;
}
public static IEnumerable<Work> ToPocos(this IEnumerable<WorkDTO> dtos)
=> dtos.Select(dto => dto.ToPoco());
public static Book ToPoco(this BookDTO dto) public static IEnumerable<Link> ToPocos(this IEnumerable<LinkDTO> dtos) =>
{ dtos.Select(dto => dto.ToPoco());
var result = BooksMapper.GetT(dto);
if(result == null) public static Author ToPoco(this AuthorDTO dto)
{ {
result = new Book var result = AuthorsMapper.GetT(dto);
{ if (result == null)
Authors = dto.Authors.ToPocos().ToList(), {
Contributors = dto.Contributors.ToPocos().ToList(), result = new Author
Format = dto.Format, {
Id = dto.Id, AlternateNames = dto.AlternateNames,
ISBN13 = dto.ISBN13, Bio = dto.Bio,
Language = dto.Language.ToModel(), BirthDate = dto.BirthDate,
NbPages = dto.NbPages, DeathDate = dto.DeathDate,
PublishDate = dto.PublishDate, Id = dto.Id,
Publishers = dto.Publishers, Links = dto.Links.ToPocos().ToList(),
Series = dto.Series, Name = dto.Name
Title = dto.Title, };
Works = dto.Works.ToPocos().ToList() }
}; return result;
} }
return result;
} public static IEnumerable<Author> ToPocos(this IEnumerable<AuthorDTO> dtos) =>
public static IEnumerable<Book> ToPocos(this IEnumerable<BookDTO> dtos) dtos.Select(dto => dto.ToPoco());
=> dtos.Select(dto => dto.ToPoco());
} public static Work ToPoco(this WorkDTO dto)
} {
var result = WorksMapper.GetT(dto);
if (result == null)
{
result = new Work
{
Authors = dto.Authors.ToPocos().ToList(),
Description = dto.Description,
Id = dto.Id,
Ratings = dto.Ratings.ToPoco(),
Subjects = dto.Subjects,
Title = dto.Title
};
}
return result;
}
public static IEnumerable<Work> ToPocos(this IEnumerable<WorkDTO> dtos) =>
dtos.Select(dto => dto.ToPoco());
public static Book ToPoco(this BookDTO dto)
{
var result = BooksMapper.GetT(dto);
if (result == null)
{
result = new Book
{
Authors = dto.Authors.ToPocos().ToList(),
Contributors = dto.Contributors.ToPocos().ToList(),
Format = dto.Format,
Id = dto.Id,
ISBN13 = dto.ISBN13,
Language = dto.Language.ToModel(),
NbPages = dto.NbPages,
PublishDate = dto.PublishDate,
Publishers = dto.Publishers,
Series = dto.Series,
Title = dto.Title,
Works = dto.Works.ToPocos().ToList()
};
}
return result;
}
public static IEnumerable<Book> ToPocos(this IEnumerable<BookDTO> dtos) =>
dtos.Select(dto => dto.ToPoco());
}
}

@ -12,7 +12,12 @@ public class LibraryStub : ILibraryManager
return (await StubDTO.GetAuthorById(id)).ToPoco(); return (await StubDTO.GetAuthorById(id)).ToPoco();
} }
public async Task<Tuple<long, IEnumerable<Author>>> GetAuthorsByName(string substring, int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<Author>>> GetAuthorsByName(
string substring,
int index,
int count,
string sort = ""
)
{ {
var result = await StubDTO.GetAuthorsByName(substring, index, count, sort); var result = await StubDTO.GetAuthorsByName(substring, index, count, sort);
return Tuple.Create(result.Item1, result.Item2.ToPocos()); return Tuple.Create(result.Item1, result.Item2.ToPocos());
@ -28,22 +33,36 @@ public class LibraryStub : ILibraryManager
return (await StubDTO.GetBookByISBN(isbn)).ToPoco(); return (await StubDTO.GetBookByISBN(isbn)).ToPoco();
} }
public async Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthor(string author, int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthor(
string author,
int index,
int count,
string sort = ""
)
{ {
var result = await StubDTO.GetBooksByAuthor(author, index, count, sort); var result = await StubDTO.GetBooksByAuthor(author, index, count, sort);
return Tuple.Create(result.Item1, result.Item2.ToPocos()); return Tuple.Create(result.Item1, result.Item2.ToPocos());
} }
public async Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthorId(string authorId, int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthorId(
string authorId,
int index,
int count,
string sort = ""
)
{ {
var result = await StubDTO.GetBooksByAuthor(authorId, index, count, sort); var result = await StubDTO.GetBooksByAuthor(authorId, index, count, sort);
return Tuple.Create(result.Item1, result.Item2.ToPocos()); return Tuple.Create(result.Item1, result.Item2.ToPocos());
} }
public async Task<Tuple<long, IEnumerable<Book>>> GetBooksByTitle(string title, int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<Book>>> GetBooksByTitle(
string title,
int index,
int count,
string sort = ""
)
{ {
var result = await StubDTO.GetBooksByTitle(title, index, count, sort); var result = await StubDTO.GetBooksByTitle(title, index, count, sort);
return Tuple.Create(result.Item1, result.Item2.ToPocos()); return Tuple.Create(result.Item1, result.Item2.ToPocos());
} }
} }

@ -7,9 +7,10 @@ using LibraryDTO;
namespace Stub namespace Stub
{ {
static class Mapper static class Mapper
{ {
internal static Mapper<Author, AuthorDTO> AuthorsMapper { get; } = new Mapper<Author, AuthorDTO>(); internal static Mapper<Author, AuthorDTO> AuthorsMapper { get; } =
new Mapper<Author, AuthorDTO>();
internal static Mapper<Work, WorkDTO> WorksMapper { get; } = new Mapper<Work, WorkDTO>(); internal static Mapper<Work, WorkDTO> WorksMapper { get; } = new Mapper<Work, WorkDTO>();
internal static Mapper<Book, BookDTO> BooksMapper { get; } = new Mapper<Book, BookDTO>(); internal static Mapper<Book, BookDTO> BooksMapper { get; } = new Mapper<Book, BookDTO>();
@ -20,6 +21,4 @@ namespace Stub
BooksMapper.Reset(); BooksMapper.Reset();
} }
} }
} }

@ -7,8 +7,8 @@ using System.Xml.Linq;
namespace StubLib namespace StubLib
{ {
public class UserLibraryStub : IUserLibraryManager public class UserLibraryStub : IUserLibraryManager
{ {
public ReadOnlyCollection<Book> Favorites { get; private set; } public ReadOnlyCollection<Book> Favorites { get; private set; }
private List<Book> favorites = new List<Book>(); private List<Book> favorites = new List<Book>();
@ -26,8 +26,8 @@ namespace StubLib
public ILibraryManager LibraryMgr { get; private set; } public ILibraryManager LibraryMgr { get; private set; }
public UserLibraryStub(ILibraryManager libraryMgr) public UserLibraryStub(ILibraryManager libraryMgr)
{ {
LibraryMgr = libraryMgr; LibraryMgr = libraryMgr;
Favorites = new ReadOnlyCollection<Book>(favorites); Favorites = new ReadOnlyCollection<Book>(favorites);
Books = new ReadOnlyCollection<Book>(books); Books = new ReadOnlyCollection<Book>(books);
@ -35,42 +35,75 @@ namespace StubLib
Loans = new ReadOnlyCollection<Loan>(loans); Loans = new ReadOnlyCollection<Loan>(loans);
Contacts = new ReadOnlyCollection<Contact>(contacts); Contacts = new ReadOnlyCollection<Contact>(contacts);
contacts.AddRange(new Contact[] contacts.AddRange(
{ new Contact[]
new Contact { Id = "/contacts/01", FirstName = "Audrey", LastName = "Pouclet" }, {
new Contact { Id = "/contacts/02", FirstName = "Malika", LastName = "More" }, new Contact
new Contact { Id = "/contacts/03", FirstName = "Antoine" }, {
}); Id = "/contacts/01",
books.AddRange(new Book[] FirstName = "Audrey",
{ LastName = "Pouclet"
LibraryMgr.GetBookById("/books/OL25910297M").Result, },
LibraryMgr.GetBookById("/books/OL26210208M").Result, new Contact
LibraryMgr.GetBookById("/books/OL27258011M").Result, {
LibraryMgr.GetBookById("/books/OL28294024M").Result, Id = "/contacts/02",
LibraryMgr.GetBookById("/books/OL28639494M").Result, FirstName = "Malika",
LibraryMgr.GetBookById("/books/OL35699439M").Result, LastName = "More"
LibraryMgr.GetBookById("/books/OL37758347M").Result, },
LibraryMgr.GetBookById("/books/OL38218739M").Result, new Contact { Id = "/contacts/03", FirstName = "Antoine" },
LibraryMgr.GetBookById("/books/OL38586212M").Result, }
LibraryMgr.GetBookById("/books/OL8839071M").Result, );
LibraryMgr.GetBookById("/books/OL8198056M").Result, books.AddRange(
}); new Book[]
{
LibraryMgr.GetBookById("/books/OL25910297M").Result,
LibraryMgr.GetBookById("/books/OL26210208M").Result,
LibraryMgr.GetBookById("/books/OL27258011M").Result,
LibraryMgr.GetBookById("/books/OL28294024M").Result,
LibraryMgr.GetBookById("/books/OL28639494M").Result,
LibraryMgr.GetBookById("/books/OL35699439M").Result,
LibraryMgr.GetBookById("/books/OL37758347M").Result,
LibraryMgr.GetBookById("/books/OL38218739M").Result,
LibraryMgr.GetBookById("/books/OL38586212M").Result,
LibraryMgr.GetBookById("/books/OL8839071M").Result,
LibraryMgr.GetBookById("/books/OL8198056M").Result,
}
);
books[0].Status = Status.Finished; books[0].Status = Status.Finished;
books[0].UserNote = "Super bouquin de SF !"; books[0].UserNote = "Super bouquin de SF !";
books[0].UserRating = 4.5f; books[0].UserRating = 4.5f;
loans.Add(new Loan { Id = "/loans/01", Book = books[0], Loaner = contacts[0], LoanedAt = new DateTime(2022, 7, 12), ReturnedAt = new DateTime(2023, 9, 1) }); loans.Add(
new Loan
{
Id = "/loans/01",
Book = books[0],
Loaner = contacts[0],
LoanedAt = new DateTime(2022, 7, 12),
ReturnedAt = new DateTime(2023, 9, 1)
}
);
books[1].Status = Status.ToBeRead; books[1].Status = Status.ToBeRead;
books[2].Status = Status.Finished; books[2].Status = Status.Finished;
books[2].UserNote = "Des nouvelles de SF. Super auteur à découvrir !"; books[2].UserNote = "Des nouvelles de SF. Super auteur à découvrir !";
books[2].UserRating = 4.8f; books[2].UserRating = 4.8f;
books[3].Status = Status.Finished; books[3].Status = Status.Finished;
books[3].UserRating = 4.0f; books[3].UserRating = 4.0f;
loans.Add(new Loan { Id = "/loans/02", Book = books[3], Loaner = contacts[2], LoanedAt = new DateTime(2020, 12, 23), ReturnedAt = new DateTime(2021, 8, 13) } ); loans.Add(
new Loan
{
Id = "/loans/02",
Book = books[3],
Loaner = contacts[2],
LoanedAt = new DateTime(2020, 12, 23),
ReturnedAt = new DateTime(2021, 8, 13)
}
);
books[4].Status = Status.Finished; books[4].Status = Status.Finished;
books[4].UserNote = "Déjà moins connu que le premier, et pourtant..."; books[4].UserNote = "Déjà moins connu que le premier, et pourtant...";
books[4].UserRating = 4.2f; books[4].UserRating = 4.2f;
books[5].Status = Status.Finished; books[5].Status = Status.Finished;
books[5].UserNote = "Coup de coeur. Poétique, anarchique, philosophique... + SF. Du Deleuze et du Foucault chez Damasio"; books[5].UserNote =
"Coup de coeur. Poétique, anarchique, philosophique... + SF. Du Deleuze et du Foucault chez Damasio";
books[5].UserRating = 4.9f; books[5].UserRating = 4.9f;
books[6].Status = Status.NotRead; books[6].Status = Status.NotRead;
books[7].Status = Status.Finished; books[7].Status = Status.Finished;
@ -82,38 +115,50 @@ namespace StubLib
books[9].Status = Status.ToBeRead; books[9].Status = Status.ToBeRead;
books[9].Status = Status.Reading; books[9].Status = Status.Reading;
borrowings.Add(new Borrowing borrowings.Add(
{ new Borrowing
Id = "/borrowing/01", Owner = contacts[0], {
Book = LibraryMgr.GetBookById("/books/OL27328194M").Result, Id = "/borrowing/01",
BorrowedAt = new DateTime(2023, 9, 7) Owner = contacts[0],
}); Book = LibraryMgr.GetBookById("/books/OL27328194M").Result,
borrowings.Add(new Borrowing BorrowedAt = new DateTime(2023, 9, 7)
{ }
Id = "/borrowing/02", Owner = contacts[1], );
Book = LibraryMgr.GetBookById("/books/OL27989051M").Result, borrowings.Add(
BorrowedAt = new DateTime(2022, 7, 7), new Borrowing
ReturnedAt = new DateTime(2023, 3, 1) {
}); Id = "/borrowing/02",
borrowings.Add(new Borrowing Owner = contacts[1],
{ Book = LibraryMgr.GetBookById("/books/OL27989051M").Result,
Id = "/borrowing/03", Owner = contacts[1], BorrowedAt = new DateTime(2022, 7, 7),
Book = LibraryMgr.GetBookById("/books/OL35698073M").Result, ReturnedAt = new DateTime(2023, 3, 1)
BorrowedAt = new DateTime(2022, 7, 7), }
ReturnedAt = new DateTime(2022, 9, 1) );
}); borrowings.Add(
borrowings.Add(new Borrowing new Borrowing
{ {
Id = "/borrowing/04", Owner = contacts[1], Id = "/borrowing/03",
Book = LibraryMgr.GetBookById("/books/OL35698083M").Result, Owner = contacts[1],
BorrowedAt = new DateTime(2022, 7, 7), Book = LibraryMgr.GetBookById("/books/OL35698073M").Result,
ReturnedAt = new DateTime(2023, 8, 30) BorrowedAt = new DateTime(2022, 7, 7),
}); ReturnedAt = new DateTime(2022, 9, 1)
} }
);
borrowings.Add(
new Borrowing
{
Id = "/borrowing/04",
Owner = contacts[1],
Book = LibraryMgr.GetBookById("/books/OL35698083M").Result,
BorrowedAt = new DateTime(2022, 7, 7),
ReturnedAt = new DateTime(2023, 8, 30)
}
);
}
public Task<Book> AddBook(Book book) public Task<Book> AddBook(Book book)
{ {
if(Books.Contains(book)) if (Books.Contains(book))
{ {
return Task.FromResult<Book>(null); return Task.FromResult<Book>(null);
} }
@ -123,7 +168,7 @@ namespace StubLib
public async Task<Book> AddBook(string id) public async Task<Book> AddBook(string id)
{ {
if(Books.SingleOrDefault(b => b.Id == id) != null) if (Books.SingleOrDefault(b => b.Id == id) != null)
{ {
return null; return null;
} }
@ -134,7 +179,7 @@ namespace StubLib
public async Task<Book> AddBookByIsbn(string isbn) public async Task<Book> AddBookByIsbn(string isbn)
{ {
if(Books.SingleOrDefault(b => b.ISBN13 == isbn) != null) if (Books.SingleOrDefault(b => b.ISBN13 == isbn) != null)
{ {
return null; return null;
} }
@ -160,12 +205,12 @@ namespace StubLib
public Task<bool> AddToFavorites(Book book) public Task<bool> AddToFavorites(Book book)
{ {
if(Favorites.Contains(book)) if (Favorites.Contains(book))
{ {
return Task.FromResult(false); return Task.FromResult(false);
} }
var bookToAdd = Books.SingleOrDefault(b => b.Id == book.Id); var bookToAdd = Books.SingleOrDefault(b => b.Id == book.Id);
if(bookToAdd == null) if (bookToAdd == null)
{ {
return Task.FromResult(false); return Task.FromResult(false);
} }
@ -175,12 +220,12 @@ namespace StubLib
public Task<bool> AddToFavorites(string bookId) public Task<bool> AddToFavorites(string bookId)
{ {
if(Favorites.SingleOrDefault(b => b.Id == bookId) != null) if (Favorites.SingleOrDefault(b => b.Id == bookId) != null)
{ {
return Task.FromResult(false); return Task.FromResult(false);
} }
var book = Books.SingleOrDefault(b => b.Id == bookId); var book = Books.SingleOrDefault(b => b.Id == bookId);
if(book == null) if (book == null)
{ {
return Task.FromResult(false); return Task.FromResult(false);
} }
@ -200,7 +245,7 @@ namespace StubLib
public Task<Contact> AddContact(Contact contact) public Task<Contact> AddContact(Contact contact)
{ {
if(Contacts.Contains(contact)) if (Contacts.Contains(contact))
{ {
return Task.FromResult<Contact>(null); return Task.FromResult<Contact>(null);
} }
@ -215,12 +260,17 @@ namespace StubLib
public Task<bool> LendBook(Book book, Contact contact, DateTime? loanDate = null) public Task<bool> LendBook(Book book, Contact contact, DateTime? loanDate = null)
{ {
if(!Books.Contains(book)) if (!Books.Contains(book))
return Task.FromResult(false); return Task.FromResult(false);
if(!Contacts.Contains(contact)) if (!Contacts.Contains(contact))
AddContact(contact); AddContact(contact);
Loan loan = new Loan { Book = book, Loaner = contact, LoanedAt = loanDate.GetValueOrDefault(DateTime.Now) }; Loan loan = new Loan
if(Loans.Contains(loan)) {
Book = book,
Loaner = contact,
LoanedAt = loanDate.GetValueOrDefault(DateTime.Now)
};
if (Loans.Contains(loan))
return Task.FromResult(false); return Task.FromResult(false);
loans.Add(loan); loans.Add(loan);
return Task.FromResult(true); return Task.FromResult(true);
@ -228,10 +278,10 @@ namespace StubLib
public Task<bool> GetBackBook(Book book, DateTime? returnedDate = null) public Task<bool> GetBackBook(Book book, DateTime? returnedDate = null)
{ {
if(!Books.Contains(book)) if (!Books.Contains(book))
return Task.FromResult(false); return Task.FromResult(false);
var loan = loans.SingleOrDefault(l => l.Book == book); var loan = loans.SingleOrDefault(l => l.Book == book);
if(loan == null) if (loan == null)
return Task.FromResult(false); return Task.FromResult(false);
loan.ReturnedAt = returnedDate.GetValueOrDefault(DateTime.Now); loan.ReturnedAt = returnedDate.GetValueOrDefault(DateTime.Now);
return Task.FromResult(true); return Task.FromResult(true);
@ -239,12 +289,17 @@ namespace StubLib
public Task<bool> BorrowBook(Book book, Contact owner, DateTime? borrowedDate = null) public Task<bool> BorrowBook(Book book, Contact owner, DateTime? borrowedDate = null)
{ {
if(!Books.Contains(book)) if (!Books.Contains(book))
return Task.FromResult(false); return Task.FromResult(false);
if(!Contacts.Contains(owner)) if (!Contacts.Contains(owner))
AddContact(owner); AddContact(owner);
Borrowing borrow = new Borrowing { Book = book, Owner = owner, BorrowedAt = borrowedDate.GetValueOrDefault(DateTime.Now) }; Borrowing borrow = new Borrowing
if(Borrowings.Contains(borrow)) {
Book = book,
Owner = owner,
BorrowedAt = borrowedDate.GetValueOrDefault(DateTime.Now)
};
if (Borrowings.Contains(borrow))
return Task.FromResult(false); return Task.FromResult(false);
borrowings.Add(borrow); borrowings.Add(borrow);
return Task.FromResult(true); return Task.FromResult(true);
@ -252,10 +307,10 @@ namespace StubLib
public Task<bool> GiveBackBook(Book book, DateTime? returnedDate = null) public Task<bool> GiveBackBook(Book book, DateTime? returnedDate = null)
{ {
if(!Books.Contains(book)) if (!Books.Contains(book))
return Task.FromResult(false); return Task.FromResult(false);
var borrow = borrowings.SingleOrDefault(b => b.Book == book); var borrow = borrowings.SingleOrDefault(b => b.Book == book);
if(borrow == null) if (borrow == null)
return Task.FromResult(false); return Task.FromResult(false);
borrow.ReturnedAt = returnedDate.GetValueOrDefault(DateTime.Now); borrow.ReturnedAt = returnedDate.GetValueOrDefault(DateTime.Now);
return Task.FromResult(true); return Task.FromResult(true);
@ -271,20 +326,40 @@ namespace StubLib
return Task.FromResult(Books.SingleOrDefault(b => b.ISBN13 == isbn)); return Task.FromResult(Books.SingleOrDefault(b => b.ISBN13 == isbn));
} }
public Task<Tuple<long, IEnumerable<Book>>> GetBooksByTitle(string title, int index, int count, string sort = "") public Task<Tuple<long, IEnumerable<Book>>> GetBooksByTitle(
string title,
int index,
int count,
string sort = ""
)
{ {
var foundBooks = Books.Where(b => b.Title.Contains(title, StringComparison.InvariantCultureIgnoreCase)); var foundBooks = Books.Where(
b => b.Title.Contains(title, StringComparison.InvariantCultureIgnoreCase)
);
return OrderBooks(foundBooks, index, count, sort); return OrderBooks(foundBooks, index, count, sort);
} }
public Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthorId(string authorId, int index, int count, string sort = "") public Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthorId(
string authorId,
int index,
int count,
string sort = ""
)
{ {
var foundBooks = Books.Where(b => b.Authors.Exists(a => a.Id.Contains(authorId)) var foundBooks = Books.Where(
|| b.Works.Exists(w => w.Authors.Exists(a => a.Id.Contains(authorId)))); b =>
b.Authors.Exists(a => a.Id.Contains(authorId))
|| b.Works.Exists(w => w.Authors.Exists(a => a.Id.Contains(authorId)))
);
return OrderBooks(books, index, count, sort); return OrderBooks(books, index, count, sort);
} }
public Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthor(string author, int index, int count, string sort = "") public Task<Tuple<long, IEnumerable<Book>>> GetBooksByAuthor(
string author,
int index,
int count,
string sort = ""
)
{ {
var foundBooks = Books.Where(b => ContainsAuthorName(b, author)); var foundBooks = Books.Where(b => ContainsAuthorName(b, author));
return OrderBooks(books, index, count, sort); return OrderBooks(books, index, count, sort);
@ -305,9 +380,14 @@ namespace StubLib
return Task.FromResult(Authors.SingleOrDefault(a => a.Id == id)); return Task.FromResult(Authors.SingleOrDefault(a => a.Id == id));
} }
private Task<Tuple<long, IEnumerable<Author>>> OrderAuthors(IEnumerable<Author> authors, int index, int count, string sort = "") private Task<Tuple<long, IEnumerable<Author>>> OrderAuthors(
IEnumerable<Author> authors,
int index,
int count,
string sort = ""
)
{ {
switch(sort) switch (sort)
{ {
case "name": case "name":
authors = authors.OrderBy(a => a.Name); authors = authors.OrderBy(a => a.Name);
@ -316,19 +396,31 @@ namespace StubLib
authors = authors.OrderByDescending(a => a.Name); authors = authors.OrderByDescending(a => a.Name);
break; break;
} }
return Task.FromResult(Tuple.Create((long)authors.Count(), authors.Skip(index*count).Take(count))); return Task.FromResult(
} Tuple.Create((long)authors.Count(), authors.Skip(index * count).Take(count))
);
public Task<Tuple<long, IEnumerable<Author>>> GetAuthorsByName(string substring, int index, int count, string sort = "") }
{
var foundAuthors = Authors.Where(a => a.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase) public Task<Tuple<long, IEnumerable<Author>>> GetAuthorsByName(
|| a.AlternateNames.Exists(alt => alt.Contains(substring, StringComparison.InvariantCultureIgnoreCase))); string substring,
int index,
int count,
string sort = ""
)
{
var foundAuthors = Authors.Where(
a =>
a.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase)
|| a.AlternateNames.Exists(
alt => alt.Contains(substring, StringComparison.InvariantCultureIgnoreCase)
)
);
return OrderAuthors(foundAuthors, index, count, sort); return OrderAuthors(foundAuthors, index, count, sort);
} }
public Task<Book> UpdateBook(Book updatedBook) public Task<Book> UpdateBook(Book updatedBook)
{ {
if(!books.Contains(updatedBook)) if (!books.Contains(updatedBook))
{ {
return Task.FromResult<Book>(null); return Task.FromResult<Book>(null);
} }
@ -337,9 +429,14 @@ namespace StubLib
return Task.FromResult(updatedBook); return Task.FromResult(updatedBook);
} }
private Task<Tuple<long, IEnumerable<Book>>> OrderBooks(IEnumerable<Book> books, int index, int count, string sort = "") private Task<Tuple<long, IEnumerable<Book>>> OrderBooks(
IEnumerable<Book> books,
int index,
int count,
string sort = ""
)
{ {
switch(sort) switch (sort)
{ {
case "title": case "title":
books = books.OrderBy(b => b.Title); books = books.OrderBy(b => b.Title);
@ -353,29 +450,34 @@ namespace StubLib
case "old": case "old":
books = books.OrderBy(b => b.PublishDate); books = books.OrderBy(b => b.PublishDate);
break; break;
} }
return Task.FromResult(Tuple.Create(books.LongCount(), books.Skip(index*count).Take(count))); return Task.FromResult(
Tuple.Create(books.LongCount(), books.Skip(index * count).Take(count))
);
} }
private bool ContainsAuthorName(Book book, string name) private bool ContainsAuthorName(Book book, string name)
{ {
IEnumerable<Author> authors = new List<Author>(); IEnumerable<Author> authors = new List<Author>();
if(book.Authors != null && book.Authors.Count > 0) if (book.Authors != null && book.Authors.Count > 0)
{ {
authors = authors.Union(book.Authors); authors = authors.Union(book.Authors);
} }
if(book.Works != null) if (book.Works != null)
{ {
var worksAuthors = book.Works.SelectMany(w => w.Authors).ToList(); var worksAuthors = book.Works.SelectMany(w => w.Authors).ToList();
if(worksAuthors.Count > 0) if (worksAuthors.Count > 0)
authors = authors.Union(worksAuthors); authors = authors.Union(worksAuthors);
} }
foreach(var author in authors) foreach (var author in authors)
{ {
if(author.Name.Contains(name, StringComparison.OrdinalIgnoreCase) if (
|| author.AlternateNames.Exists(alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase))) author.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| author.AlternateNames.Exists(
alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)
)
)
{ {
return true; return true;
} }
@ -383,7 +485,11 @@ namespace StubLib
return false; return false;
} }
public Task<Tuple<long, IEnumerable<Book>>> GetBooksFromCollection(int index, int count, string sort = "") public Task<Tuple<long, IEnumerable<Book>>> GetBooksFromCollection(
int index,
int count,
string sort = ""
)
{ {
return OrderBooks(Books, index, count, sort); return OrderBooks(Books, index, count, sort);
} }
@ -391,31 +497,46 @@ namespace StubLib
public Task<Tuple<long, IEnumerable<Loan>>> GetCurrentLoans(int index, int count) public Task<Tuple<long, IEnumerable<Loan>>> GetCurrentLoans(int index, int count)
{ {
var currentLoans = Loans.Where(l => !l.ReturnedAt.HasValue); var currentLoans = Loans.Where(l => !l.ReturnedAt.HasValue);
return Task.FromResult(Tuple.Create(currentLoans.LongCount(), currentLoans.Skip(index*count).Take(count))); return Task.FromResult(
Tuple.Create(currentLoans.LongCount(), currentLoans.Skip(index * count).Take(count))
);
} }
public Task<Tuple<long, IEnumerable<Loan>>> GetPastLoans(int index, int count) public Task<Tuple<long, IEnumerable<Loan>>> GetPastLoans(int index, int count)
{ {
var currentLoans = Loans.Where(l => l.ReturnedAt.HasValue); var currentLoans = Loans.Where(l => l.ReturnedAt.HasValue);
return Task.FromResult(Tuple.Create(currentLoans.LongCount(), currentLoans.Skip(index*count).Take(count))); return Task.FromResult(
Tuple.Create(currentLoans.LongCount(), currentLoans.Skip(index * count).Take(count))
);
} }
public Task<Tuple<long, IEnumerable<Borrowing>>> GetCurrentBorrowings(int index, int count) public Task<Tuple<long, IEnumerable<Borrowing>>> GetCurrentBorrowings(int index, int count)
{ {
var currentBorrowings = Borrowings.Where(l => !l.ReturnedAt.HasValue); var currentBorrowings = Borrowings.Where(l => !l.ReturnedAt.HasValue);
return Task.FromResult(Tuple.Create(currentBorrowings.LongCount(), currentBorrowings.Skip(index*count).Take(count))); return Task.FromResult(
Tuple.Create(
currentBorrowings.LongCount(),
currentBorrowings.Skip(index * count).Take(count)
)
);
} }
public Task<Tuple<long, IEnumerable<Borrowing>>> GetPastBorrowings(int index, int count) public Task<Tuple<long, IEnumerable<Borrowing>>> GetPastBorrowings(int index, int count)
{ {
var currentBorrowings = Borrowings.Where(l => l.ReturnedAt.HasValue); var currentBorrowings = Borrowings.Where(l => l.ReturnedAt.HasValue);
return Task.FromResult(Tuple.Create(currentBorrowings.LongCount(), currentBorrowings.Skip(index*count).Take(count))); return Task.FromResult(
Tuple.Create(
currentBorrowings.LongCount(),
currentBorrowings.Skip(index * count).Take(count)
)
);
} }
public Task<Tuple<long, IEnumerable<Contact>>> GetContacts(int index, int count) public Task<Tuple<long, IEnumerable<Contact>>> GetContacts(int index, int count)
{ {
return Task.FromResult(Tuple.Create(Contacts.LongCount(), Contacts.Skip(index*count).Take(count))); return Task.FromResult(
Tuple.Create(Contacts.LongCount(), Contacts.Skip(index * count).Take(count))
);
} }
} }
} }

@ -1,208 +1,270 @@
using System.Data.SqlTypes; using System.Data.SqlTypes;
using System.Reflection; using System.Reflection;
using DtoAbstractLayer; using DtoAbstractLayer;
using JsonReader; using JsonReader;
using LibraryDTO; using LibraryDTO;
using static System.Reflection.Metadata.BlobBuilder; using static System.Reflection.Metadata.BlobBuilder;
namespace StubbedDTO; namespace StubbedDTO;
public class Stub : IDtoManager public class Stub : IDtoManager
{ {
public static List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>(); public static List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>();
public static List<BookDTO> Books { get; set; } = new List<BookDTO>(); public static List<BookDTO> Books { get; set; } = new List<BookDTO>();
public static List<WorkDTO> Works { get; set; } = new List<WorkDTO>(); public static List<WorkDTO> Works { get; set; } = new List<WorkDTO>();
public static Assembly Assembly => typeof(Stub).Assembly; public static Assembly Assembly => typeof(Stub).Assembly;
static Stub() static Stub()
{ {
foreach(var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("authors"))) foreach (
{ var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("authors"))
using(Stream stream = Assembly.GetManifestResourceStream(resource)) )
using(StreamReader reader = new StreamReader(stream)) {
{ using (Stream stream = Assembly.GetManifestResourceStream(resource))
Authors.Add(AuthorJsonReader.ReadAuthor(reader.ReadToEnd())); using (StreamReader reader = new StreamReader(stream))
} {
} Authors.Add(AuthorJsonReader.ReadAuthor(reader.ReadToEnd()));
}
foreach(var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("works"))) }
{
var ratingsResource = resource.Insert(resource.LastIndexOf('.'), ".ratings").Replace("works", "ratings"); foreach (
var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("works"))
using(Stream stream = Assembly.GetManifestResourceStream(resource)) )
using(StreamReader reader = new StreamReader(stream)) {
using(Stream streamRatings = Assembly.GetManifestResourceStream(ratingsResource)) var ratingsResource = resource
using(StreamReader readerRatings = new StreamReader(streamRatings)) .Insert(resource.LastIndexOf('.'), ".ratings")
{ .Replace("works", "ratings");
var work = WorkJsonReader.ReadWork(reader.ReadToEnd(), readerRatings.ReadToEnd());
if(work.Authors != null) using (Stream stream = Assembly.GetManifestResourceStream(resource))
foreach(var author in work.Authors.ToList()) using (StreamReader reader = new StreamReader(stream))
{ using (Stream streamRatings = Assembly.GetManifestResourceStream(ratingsResource))
var newAuthor = Authors.SingleOrDefault(a => a.Id == author.Id); using (StreamReader readerRatings = new StreamReader(streamRatings))
work.Authors.Remove(author); {
work.Authors.Add(newAuthor); var work = WorkJsonReader.ReadWork(reader.ReadToEnd(), readerRatings.ReadToEnd());
} if (work.Authors != null)
Works.Add(work); foreach (var author in work.Authors.ToList())
} {
} var newAuthor = Authors.SingleOrDefault(a => a.Id == author.Id);
work.Authors.Remove(author);
foreach(var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("books"))) work.Authors.Add(newAuthor);
{ }
using(Stream stream = Assembly.GetManifestResourceStream(resource)) Works.Add(work);
using(StreamReader reader = new StreamReader(stream)) }
{ }
var book = BookJsonReader.ReadBook(reader.ReadToEnd());
foreach(var author in book.Authors.ToList()) foreach (
{ var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("books"))
var newAuthor = Authors.SingleOrDefault(a => a.Id == author.Id); )
book.Authors.Remove(author); {
book.Authors.Add(newAuthor); using (Stream stream = Assembly.GetManifestResourceStream(resource))
} using (StreamReader reader = new StreamReader(stream))
foreach(var work in book.Works.ToList()) {
{ var book = BookJsonReader.ReadBook(reader.ReadToEnd());
var newWork = Works.SingleOrDefault(w => w.Id == work.Id); foreach (var author in book.Authors.ToList())
book.Works.Remove(work); {
book.Works.Add(newWork); var newAuthor = Authors.SingleOrDefault(a => a.Id == author.Id);
} book.Authors.Remove(author);
Books.Add(book); book.Authors.Add(newAuthor);
} }
} foreach (var work in book.Works.ToList())
} {
var newWork = Works.SingleOrDefault(w => w.Id == work.Id);
public Task<AuthorDTO> GetAuthorById(string id) book.Works.Remove(work);
{ book.Works.Add(newWork);
var author = Stub.Authors.SingleOrDefault(a => a.Id.Contains(id)); }
return Task.FromResult(author); Books.Add(book);
} }
}
private Task<Tuple<long, IEnumerable<AuthorDTO>>> OrderAuthors(IEnumerable<AuthorDTO> authors, int index, int count, string sort = "") }
{
switch(sort) public Task<AuthorDTO> GetAuthorById(string id)
{ {
case "name": var author = Stub.Authors.SingleOrDefault(a => a.Id.Contains(id));
authors = authors.OrderBy(a => a.Name); return Task.FromResult(author);
break; }
case "name_reverse":
authors = authors.OrderByDescending(a => a.Name); private Task<Tuple<long, IEnumerable<AuthorDTO>>> OrderAuthors(
break; IEnumerable<AuthorDTO> authors,
} int index,
return Task.FromResult(Tuple.Create((long)authors.Count(), authors.Skip(index*count).Take(count))); int count,
} string sort = ""
)
public async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthors(int index, int count, string sort = "") {
{ switch (sort)
IEnumerable<AuthorDTO> authors = Stub.Authors; {
return await OrderAuthors(authors, index, count, sort); case "name":
} authors = authors.OrderBy(a => a.Name);
break;
public async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthorsByName(string name, int index, int count, string sort = "") case "name_reverse":
{ authors = authors.OrderByDescending(a => a.Name);
var authors = Stub.Authors.Where(a => a.Name.Contains(name, StringComparison.OrdinalIgnoreCase) break;
|| a.AlternateNames.Exists(alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase))); }
return await OrderAuthors(authors, index, count, sort); return Task.FromResult(
} Tuple.Create((long)authors.Count(), authors.Skip(index * count).Take(count))
);
public Task<BookDTO> GetBookById(string id) }
{
var book = Stub.Books.SingleOrDefault(b => b.Id.Contains(id)); public async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthors(
return Task.FromResult(book); int index,
} int count,
string sort = ""
private Task<Tuple<long, IEnumerable<BookDTO>>> OrderBooks(IEnumerable<BookDTO> books, int index, int count, string sort = "") )
{ {
switch(sort) IEnumerable<AuthorDTO> authors = Stub.Authors;
{ return await OrderAuthors(authors, index, count, sort);
case "title": }
books = books.OrderBy(b => b.Title);
break; public async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthorsByName(
case "title_reverse": string name,
books = books.OrderByDescending(b => b.Title); int index,
break; int count,
case "new": string sort = ""
books = books.OrderByDescending(b => b.PublishDate); )
break; {
case "old": var authors = Stub.Authors.Where(
books = books.OrderBy(b => b.PublishDate); a =>
break; a.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| a.AlternateNames.Exists(
} alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)
return Task.FromResult(Tuple.Create(books.LongCount(), books.Skip(index*count).Take(count))); )
} );
return await OrderAuthors(authors, index, count, sort);
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooks(int index, int count, string sort = "") }
{
var books = Stub.Books; public Task<BookDTO> GetBookById(string id)
return await OrderBooks(books, index, count, sort); {
} var book = Stub.Books.SingleOrDefault(b => b.Id.Contains(id));
return Task.FromResult(book);
public Task<BookDTO> GetBookByISBN(string isbn) }
{
var book = Stub.Books.SingleOrDefault(b => b.ISBN13.Equals(isbn, StringComparison.OrdinalIgnoreCase)); private Task<Tuple<long, IEnumerable<BookDTO>>> OrderBooks(
return Task.FromResult(book); IEnumerable<BookDTO> books,
} int index,
int count,
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByTitle(string title, int index, int count, string sort = "") string sort = ""
{ )
var books = Stub.Books.Where(b => b.Title.Contains(title, StringComparison.OrdinalIgnoreCase) {
|| b.Series.Exists(s => s.Contains(title, StringComparison.OrdinalIgnoreCase))); switch (sort)
return await OrderBooks(books, index, count, sort); {
} case "title":
books = books.OrderBy(b => b.Title);
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthorId(string authorId, int index, int count, string sort = "") break;
{ case "title_reverse":
var books = Stub.Books.Where(b => b.Authors.Exists(a => a.Id.Contains(authorId)) books = books.OrderByDescending(b => b.Title);
|| b.Works.Exists(w => w.Authors.Exists(a => a.Id.Contains(authorId)))); break;
return await OrderBooks(books, index, count, sort); case "new":
} books = books.OrderByDescending(b => b.PublishDate);
break;
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthor(string name, int index, int count, string sort = "") case "old":
{ books = books.OrderBy(b => b.PublishDate);
var books = Stub.Books.Where(b => ContainsAuthorName(b, name)); break;
return await OrderBooks(books, index, count, sort); }
} return Task.FromResult(
Tuple.Create(books.LongCount(), books.Skip(index * count).Take(count))
private bool ContainsAuthorName(BookDTO book, string name) );
{ }
IEnumerable<AuthorDTO> authors = new List<AuthorDTO>();
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooks(
if(book.Authors != null && book.Authors.Count > 0) int index,
{ int count,
authors = authors.Union(book.Authors); string sort = ""
} )
if(book.Works != null) {
{ var books = Stub.Books;
var worksAuthors = book.Works.SelectMany(w => w.Authors).ToList(); return await OrderBooks(books, index, count, sort);
if(worksAuthors.Count > 0) }
authors = authors.Union(worksAuthors);
} public Task<BookDTO> GetBookByISBN(string isbn)
foreach(var author in authors) {
{ var book = Stub.Books.SingleOrDefault(
if(author.Name.Contains(name, StringComparison.OrdinalIgnoreCase) b => b.ISBN13.Equals(isbn, StringComparison.OrdinalIgnoreCase)
|| author.AlternateNames.Exists(alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase))) );
{ return Task.FromResult(book);
return true; }
}
} public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByTitle(
return false; string title,
} int index,
int count,
public Task<Tuple<long, IEnumerable<WorkDTO>>> GetWorks(int index, int count) string sort = ""
{ )
long nbWorks = Stub.Works.Count; {
var works = Stub.Works.Skip(index*count).Take(count); var books = Stub.Books.Where(
return Task.FromResult(Tuple.Create(nbWorks, works)); b =>
} b.Title.Contains(title, StringComparison.OrdinalIgnoreCase)
|| b.Series.Exists(s => s.Contains(title, StringComparison.OrdinalIgnoreCase))
public Task<long> GetNbAuthors() );
=> Task.FromResult((long)Stub.Authors.Count); return await OrderBooks(books, index, count, sort);
}
public Task<long> GetNbBooks()
=> Task.FromResult((long)Stub.Books.Count); public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthorId(
string authorId,
public Task<long> GetNbWorks() int index,
=> Task.FromResult((long)Stub.Works.Count); int count,
} string sort = ""
)
{
var books = Stub.Books.Where(
b =>
b.Authors.Exists(a => a.Id.Contains(authorId))
|| b.Works.Exists(w => w.Authors.Exists(a => a.Id.Contains(authorId)))
);
return await OrderBooks(books, index, count, sort);
}
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthor(
string name,
int index,
int count,
string sort = ""
)
{
var books = Stub.Books.Where(b => ContainsAuthorName(b, name));
return await OrderBooks(books, index, count, sort);
}
private bool ContainsAuthorName(BookDTO book, string name)
{
IEnumerable<AuthorDTO> authors = new List<AuthorDTO>();
if (book.Authors != null && book.Authors.Count > 0)
{
authors = authors.Union(book.Authors);
}
if (book.Works != null)
{
var worksAuthors = book.Works.SelectMany(w => w.Authors).ToList();
if (worksAuthors.Count > 0)
authors = authors.Union(worksAuthors);
}
foreach (var author in authors)
{
if (
author.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| author.AlternateNames.Exists(
alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)
)
)
{
return true;
}
}
return false;
}
public Task<Tuple<long, IEnumerable<WorkDTO>>> GetWorks(int index, int count)
{
long nbWorks = Stub.Works.Count;
var works = Stub.Works.Skip(index * count).Take(count);
return Task.FromResult(Tuple.Create(nbWorks, works));
}
public Task<long> GetNbAuthors() => Task.FromResult((long)Stub.Authors.Count);
public Task<long> GetNbBooks() => Task.FromResult((long)Stub.Books.Count);
public Task<long> GetNbWorks() => Task.FromResult((long)Stub.Works.Count);
}

@ -18,7 +18,7 @@ WriteLine();
WriteLine("Test Manager.GetBooksByAuthor"); WriteLine("Test Manager.GetBooksByAuthor");
var booksFromHerbert = await manager.GetBooksByAuthor("herbert", 0, 10); var booksFromHerbert = await manager.GetBooksByAuthor("herbert", 0, 10);
foreach(var b in booksFromHerbert.books) foreach (var b in booksFromHerbert.books)
{ {
WriteLine($"\t{b.Title}"); WriteLine($"\t{b.Title}");
} }
@ -27,7 +27,7 @@ WriteLine();
WriteLine("Test Manager.GetBooks"); WriteLine("Test Manager.GetBooks");
var books = await manager.GetBooksByTitle("", 0, 100); var books = await manager.GetBooksByTitle("", 0, 100);
foreach(var b in books.books) foreach (var b in books.books)
{ {
WriteLine($"\t{b.Title}"); WriteLine($"\t{b.Title}");
} }
@ -36,7 +36,8 @@ WriteLine();
WriteLine("Test Manager.AddBook"); WriteLine("Test Manager.AddBook");
var book1 = await manager.AddBookToCollection("/books/OL25910297M"); var book1 = await manager.AddBookToCollection("/books/OL25910297M");
if(book1 == null) book1 = await manager.GetBookByIdFromCollection("/books/OL25910297M"); if (book1 == null)
book1 = await manager.GetBookByIdFromCollection("/books/OL25910297M");
book1.Status = Status.Finished; book1.Status = Status.Finished;
book1.UserRating = 5; book1.UserRating = 5;
book1.UserNote = "Trop bien !"; book1.UserNote = "Trop bien !";
@ -45,7 +46,7 @@ manager.UpdateBook(book1);
manager.AddBookToCollection("/books/OL26210208M"); manager.AddBookToCollection("/books/OL26210208M");
manager.AddBookToCollection("/books/OL27258011M"); manager.AddBookToCollection("/books/OL27258011M");
var mybooks = await manager.GetBooksFromCollection(0, 100); var mybooks = await manager.GetBooksFromCollection(0, 100);
foreach(var b in mybooks.books) foreach (var b in mybooks.books)
{ {
WriteLine($"\t{b.Title} {b.UserRating ?? -1}"); WriteLine($"\t{b.Title} {b.UserRating ?? -1}");
} }
@ -54,7 +55,7 @@ WriteLine();
WriteLine("Test Manager.GetContacts"); WriteLine("Test Manager.GetContacts");
var contacts = await manager.GetContacts(0, 100); var contacts = await manager.GetContacts(0, 100);
foreach(var c in contacts.contacts) foreach (var c in contacts.contacts)
{ {
WriteLine($"\t{c.FirstName} {c.LastName}"); WriteLine($"\t{c.FirstName} {c.LastName}");
} }
@ -63,38 +64,46 @@ WriteLine();
WriteLine("Test Manager.GetCurrentLoans"); WriteLine("Test Manager.GetCurrentLoans");
var loans = await manager.GetCurrentLoans(0, 100); var loans = await manager.GetCurrentLoans(0, 100);
foreach(var l in loans.loans) foreach (var l in loans.loans)
{ {
WriteLine($"\t{l.Book.Title} -> {l.Loaner.FirstName} {l.Loaner.LastName} ({l.LoanedAt.ToShortDateString()})"); WriteLine(
$"\t{l.Book.Title} -> {l.Loaner.FirstName} {l.Loaner.LastName} ({l.LoanedAt.ToShortDateString()})"
);
} }
WriteLine(new string('*', WindowWidth)); WriteLine(new string('*', WindowWidth));
WriteLine(); WriteLine();
WriteLine("Test Manager.GetPastLoans"); WriteLine("Test Manager.GetPastLoans");
var loans2 = await manager.GetPastLoans(0, 100); var loans2 = await manager.GetPastLoans(0, 100);
foreach(var l in loans2.loans) foreach (var l in loans2.loans)
{ {
WriteLine($"\t{l.Book.Title} -> {l.Loaner.FirstName} {l.Loaner.LastName} ({l.LoanedAt.ToShortDateString()})"); WriteLine(
$"\t{l.Book.Title} -> {l.Loaner.FirstName} {l.Loaner.LastName} ({l.LoanedAt.ToShortDateString()})"
);
} }
WriteLine(new string('*', WindowWidth)); WriteLine(new string('*', WindowWidth));
WriteLine(); WriteLine();
WriteLine("Test Manager.GetCurrentBorrowings"); WriteLine("Test Manager.GetCurrentBorrowings");
var borrowings = await manager.GetCurrentBorrowings(0, 100); var borrowings = await manager.GetCurrentBorrowings(0, 100);
foreach(var b in borrowings.borrowings) foreach (var b in borrowings.borrowings)
{ {
WriteLine($"\t{b.Book.Title} -> {b.Owner.FirstName} {b.Owner.LastName} ({b.BorrowedAt.ToShortDateString()})"); WriteLine(
$"\t{b.Book.Title} -> {b.Owner.FirstName} {b.Owner.LastName} ({b.BorrowedAt.ToShortDateString()})"
);
} }
WriteLine(new string('*', WindowWidth)); WriteLine(new string('*', WindowWidth));
WriteLine(); WriteLine();
WriteLine("Test Manager.GetPastBorrowings"); WriteLine("Test Manager.GetPastBorrowings");
var borrowings2 = await manager.GetPastBorrowings(0, 100); var borrowings2 = await manager.GetPastBorrowings(0, 100);
foreach(var b in borrowings2.borrowings) foreach (var b in borrowings2.borrowings)
{ {
WriteLine($"\t{b.Book.Title} -> {b.Owner.FirstName} {b.Owner.LastName} ({b.BorrowedAt.ToShortDateString()})"); WriteLine(
$"\t{b.Book.Title} -> {b.Owner.FirstName} {b.Owner.LastName} ({b.BorrowedAt.ToShortDateString()})"
);
} }
WriteLine(new string('*', WindowWidth)); WriteLine(new string('*', WindowWidth));
WriteLine(); WriteLine();
ReadLine(); ReadLine();

@ -1,7 +1,4 @@
namespace ToolKit namespace ToolKit
{ {
public class Class1 public class Class1 { }
{ }
}
}

@ -4,15 +4,16 @@ using System.Linq;
namespace Utils namespace Utils
{ {
public class EnumsMapper<T, U> where T : Enum public class EnumsMapper<T, U>
where U : Enum where T : Enum
where U : Enum
{ {
readonly HashSet<Tuple<T, U>> mapper = new HashSet<Tuple<T, U>>(); readonly HashSet<Tuple<T, U>> mapper = new HashSet<Tuple<T, U>>();
public T GetModel(U entity) public T GetModel(U entity)
{ {
var result = mapper.Where(tuple => tuple.Item2.Equals(entity)); var result = mapper.Where(tuple => tuple.Item2.Equals(entity));
if(result.Count() != 1) if (result.Count() != 1)
{ {
return default(T); return default(T);
} }
@ -22,7 +23,7 @@ namespace Utils
public U GetEntity(T model) public U GetEntity(T model)
{ {
var result = mapper.Where(tuple => tuple.Item1.Equals(model)); var result = mapper.Where(tuple => tuple.Item1.Equals(model));
if(result.Count() != 1) if (result.Count() != 1)
{ {
return default(U); return default(U);
} }
@ -36,7 +37,7 @@ namespace Utils
public void AddRange(params Tuple<T, U>[] tuples) public void AddRange(params Tuple<T, U>[] tuples)
{ {
foreach(var t in tuples) foreach (var t in tuples)
{ {
Add(t.Item1, t.Item2); Add(t.Item1, t.Item2);
} }
@ -48,4 +49,3 @@ namespace Utils
} }
} }
} }

@ -1,11 +1,12 @@
 using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace Utils namespace Utils
{ {
public class Mapper<T, U> where T : class public class Mapper<T, U>
where U : class where T : class
where U : class
{ {
readonly HashSet<Tuple<T, U>> mapper = new HashSet<Tuple<T, U>>(); readonly HashSet<Tuple<T, U>> mapper = new HashSet<Tuple<T, U>>();
@ -17,7 +18,7 @@ namespace Utils
public T GetT(U entity) public T GetT(U entity)
{ {
var result = mapper.Where(tuple => ReferenceEquals(tuple.Item2, entity)); var result = mapper.Where(tuple => ReferenceEquals(tuple.Item2, entity));
if(result.Count() != 1) if (result.Count() != 1)
{ {
return null; return null;
} }
@ -27,7 +28,7 @@ namespace Utils
public U GetU(T model) public U GetU(T model)
{ {
var result = mapper.Where(tuple => ReferenceEquals(tuple.Item2, model)); var result = mapper.Where(tuple => ReferenceEquals(tuple.Item2, model));
if(result.Count() != 1) if (result.Count() != 1)
{ {
return null; return null;
} }
@ -37,10 +38,10 @@ namespace Utils
public bool AddMapping(T t, U u) public bool AddMapping(T t, U u)
{ {
var mapping = new Tuple<T, U>(t, u); var mapping = new Tuple<T, U>(t, u);
if(mapper.Contains(mapping)) return false; if (mapper.Contains(mapping))
return false;
mapper.Add(mapping); mapper.Add(mapping);
return true; return true;
} }
} }
} }

@ -10,79 +10,68 @@ namespace VMWrapper
// All the code in this file is included in all platforms. // All the code in this file is included in all platforms.
public class BookViewModel : INotifyPropertyChanged public class BookViewModel : INotifyPropertyChanged
{ {
ILibraryManager data; private readonly ILibraryManager data;
public ObservableCollection<Author> authorList { get; private set; } =
new ObservableCollection<Author>();
public ObservableCollection<Book> bookList { get; private set; } =
new ObservableCollection<Book>();
public ObservableCollection<AuteurGroup> AuteurGroups { get; private set; } =
new ObservableCollection<AuteurGroup>();
public ObservableCollection<Author> authorList { get; private set; } = new ObservableCollection<Author>(); public BookViewModel(ILibraryManager data)
public ObservableCollection<Book> bookList { get; private set; } = new ObservableCollection<Book>();
public ObservableCollection<AuteurGroup> AuteurGroups { get; private set; } = new ObservableCollection<AuteurGroup>();
public event PropertyChangedEventHandler PropertyChanged;
public BookViewModel(ILibraryManager data)
{ {
this.data = data; this.data = data;
GetAuthors(); GetAuthors();
LoadBooksAsync();
} }
private async void LoadBooksAsync()
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); try
{
var (totalA, authors) = await data.GetAuthorsByName("", 0, 5);
foreach (Author author in authors)
{
var books = data.GetBooksByAuthor(author.Name, 0, 5).Result.Item2;
var observableBooks = new ObservableCollection<Book>(books);
AuteurGroups.Add(new AuteurGroup(author.Name, observableBooks));
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
} }
public class AuteurGroup : ObservableCollection<Book> public class AuteurGroup : ObservableCollection<Book>
{ {
public string Name { get; private set; } public string Name { get; private set; }
public AuteurGroup(string name, ObservableCollection<Book> books): base(books) public AuteurGroup(string name, ObservableCollection<Book> books)
: base(books)
{ {
Name = name; Name = name;
} }
} }
public void GetBooks()
{
var objet = data.GetBooksByAuthor("", 0, 8);
var ojb = objet.Result.Item2;
/*foreach (Book Book in ojb)
{
AuteurGroups.Add(new AuteurGroup(Book.Authors.Name, auteur.Books));
}
ObservableCollection<Auteur> auteurs = new Stub().CreateStubData();
foreach (Auteur auteur in auteurs)
{
AuteurGroups.Add(new AuteurGroup(auteur.Name, auteur.Books));
}
*/
}
public void GetAuthors() public void GetAuthors()
{ {
var objet = data.GetAuthorsByName("",0,10); var objet = data.GetAuthorsByName("", 0, 10).Result.Item2;
var ojb = objet.Result.Item2;
authorList.Clear(); authorList.Clear();
foreach (var author in ojb) foreach (var author in objet)
{ {
authorList.Add(author); authorList.Add(author);
} }
} }
public event PropertyChangedEventHandler PropertyChanged;
public async Task<ObservableCollection<Book>> GetBooksByTitle() protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ {
var objet = await data.GetBooksByTitle("", 0, 9); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
var ojb = objet.Item2;
return new ObservableCollection<Book>(ojb);
} }
} }
} }

@ -1,7 +1,5 @@
namespace VMWrapper namespace VMWrapper
{ {
// All the code in this file is only included on Android. // All the code in this file is only included on Android.
public class PlatformClass1 public class PlatformClass1 { }
{ }
}
}

@ -1,7 +1,5 @@
namespace VMWrapper namespace VMWrapper
{ {
// All the code in this file is only included on Mac Catalyst. // All the code in this file is only included on Mac Catalyst.
public class PlatformClass1 public class PlatformClass1 { }
{ }
}
}

@ -3,7 +3,5 @@
namespace VMWrapper namespace VMWrapper
{ {
// All the code in this file is only included on Tizen. // All the code in this file is only included on Tizen.
public class PlatformClass1 public class PlatformClass1 { }
{ }
}
}

@ -1,7 +1,5 @@
namespace VMWrapper namespace VMWrapper
{ {
// All the code in this file is only included on Windows. // All the code in this file is only included on Windows.
public class PlatformClass1 public class PlatformClass1 { }
{ }
}
}

@ -1,7 +1,5 @@
namespace VMWrapper namespace VMWrapper
{ {
// All the code in this file is only included on iOS. // All the code in this file is only included on iOS.
public class PlatformClass1 public class PlatformClass1 { }
{ }
}
}

Loading…
Cancel
Save