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

@ -5,19 +5,19 @@ 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)
{ {

@ -34,7 +34,6 @@ namespace BookApp
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
return builder.Build(); return builder.Build();

@ -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)

@ -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)

@ -5,11 +5,8 @@ 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>();
@ -18,7 +15,6 @@ public class ViewModelManager
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();

@ -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);
} }
} }
} }

@ -49,13 +49,24 @@ public static class BookJsonReader
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)
? contr
.Select(
c =>
new ContributorDTO
{
Name = (string)c["name"],
Role = (string)c["role"]
}
)
.ToList()
: new List<ContributorDTO>(),
Authors = o["authors"]?.Select(a => new AuthorDTO { Id = (string)a["key"] }).ToList() Authors = o["authors"]?.Select(a => new AuthorDTO { Id = (string)a["key"] }).ToList()
}; };
if(book.Authors == null) if (book.Authors == null)
{ {
book.Authors = new List<AuthorDTO>(); book.Authors = new List<AuthorDTO>();
} }
@ -66,15 +77,20 @@ public static class BookJsonReader
{ {
JObject o = JObject.Parse(json); JObject o = JObject.Parse(json);
long numFound = (long)o["numFound"]; long numFound = (long)o["numFound"];
var books = o["docs"].Select(doc => new BookDTO var books = o["docs"].Select(
{ doc =>
Id = (string)(doc["seed"].First()), new BookDTO
Title = (string)doc["title"], {
ISBN13 = (string)(doc["isbn"].First()), Id = (string)(doc["seed"].First()),
Authors = doc["seed"].Where(s => ((string)s).StartsWith("/authors/")) Title = (string)doc["title"],
.Select(s => new AuthorDTO { Id = (string)s }).ToList(), ISBN13 = (string)(doc["isbn"].First()),
Language = languages.GetValueOrDefault((string)(doc["language"].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); return Tuple.Create(numFound, books);
} }
@ -82,16 +98,20 @@ public static class BookJsonReader
{ {
JObject o = JObject.Parse(json); JObject o = JObject.Parse(json);
long numFound = (long)o["numFound"]; long numFound = (long)o["numFound"];
var books = o["docs"].Select(doc => new BookDTO var books = o["docs"].Select(
{ doc =>
Id = (string)(doc["seed"].First()), new BookDTO
Title = (string)doc["title"], {
ISBN13 = (string)(doc["isbn"].First()), Id = (string)(doc["seed"].First()),
Authors = doc["seed"].Where(s => ((string)s).StartsWith("/authors/")) Title = (string)doc["title"],
.Select(s => new AuthorDTO { Id = (string)s }).ToList(), ISBN13 = (string)(doc["isbn"].First()),
Language = languages.GetValueOrDefault((string)(doc["language"].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); 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))
);
} }
} }
} }

@ -19,49 +19,57 @@ public class Stub : IDtoManager
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 (Stream stream = Assembly.GetManifestResourceStream(resource))
using(StreamReader reader = new StreamReader(stream)) using (StreamReader reader = new StreamReader(stream))
{ {
Authors.Add(AuthorJsonReader.ReadAuthor(reader.ReadToEnd())); Authors.Add(AuthorJsonReader.ReadAuthor(reader.ReadToEnd()));
} }
} }
foreach(var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("works"))) foreach (
var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("works"))
)
{ {
var ratingsResource = resource.Insert(resource.LastIndexOf('.'), ".ratings").Replace("works", "ratings"); var ratingsResource = resource
.Insert(resource.LastIndexOf('.'), ".ratings")
.Replace("works", "ratings");
using(Stream stream = Assembly.GetManifestResourceStream(resource)) using (Stream stream = Assembly.GetManifestResourceStream(resource))
using(StreamReader reader = new StreamReader(stream)) using (StreamReader reader = new StreamReader(stream))
using(Stream streamRatings = Assembly.GetManifestResourceStream(ratingsResource)) using (Stream streamRatings = Assembly.GetManifestResourceStream(ratingsResource))
using(StreamReader readerRatings = new StreamReader(streamRatings)) using (StreamReader readerRatings = new StreamReader(streamRatings))
{ {
var work = WorkJsonReader.ReadWork(reader.ReadToEnd(), readerRatings.ReadToEnd()); var work = WorkJsonReader.ReadWork(reader.ReadToEnd(), readerRatings.ReadToEnd());
if(work.Authors != null) if (work.Authors != null)
foreach(var author in work.Authors.ToList()) foreach (var author in work.Authors.ToList())
{ {
var newAuthor = Authors.SingleOrDefault(a => a.Id == author.Id); var newAuthor = Authors.SingleOrDefault(a => a.Id == author.Id);
work.Authors.Remove(author); work.Authors.Remove(author);
work.Authors.Add(newAuthor); work.Authors.Add(newAuthor);
} }
Works.Add(work); Works.Add(work);
} }
} }
foreach(var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("books"))) foreach (
var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("books"))
)
{ {
using(Stream stream = Assembly.GetManifestResourceStream(resource)) using (Stream stream = Assembly.GetManifestResourceStream(resource))
using(StreamReader reader = new StreamReader(stream)) using (StreamReader reader = new StreamReader(stream))
{ {
var book = BookJsonReader.ReadBook(reader.ReadToEnd()); var book = BookJsonReader.ReadBook(reader.ReadToEnd());
foreach(var author in book.Authors.ToList()) foreach (var author in book.Authors.ToList())
{ {
var newAuthor = Authors.SingleOrDefault(a => a.Id == author.Id); var newAuthor = Authors.SingleOrDefault(a => a.Id == author.Id);
book.Authors.Remove(author); book.Authors.Remove(author);
book.Authors.Add(newAuthor); book.Authors.Add(newAuthor);
} }
foreach(var work in book.Works.ToList()) foreach (var work in book.Works.ToList())
{ {
var newWork = Works.SingleOrDefault(w => w.Id == work.Id); var newWork = Works.SingleOrDefault(w => w.Id == work.Id);
book.Works.Remove(work); book.Works.Remove(work);
@ -78,9 +86,14 @@ public class Stub : IDtoManager
return Task.FromResult(author); return Task.FromResult(author);
} }
private Task<Tuple<long, IEnumerable<AuthorDTO>>> OrderAuthors(IEnumerable<AuthorDTO> authors, int index, int count, string sort = "") private Task<Tuple<long, IEnumerable<AuthorDTO>>> OrderAuthors(
IEnumerable<AuthorDTO> 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);
@ -89,19 +102,35 @@ public class Stub : IDtoManager
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 async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthors(int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthors(
int index,
int count,
string sort = ""
)
{ {
IEnumerable<AuthorDTO> authors = Stub.Authors; IEnumerable<AuthorDTO> authors = Stub.Authors;
return await OrderAuthors(authors, index, count, sort); return await OrderAuthors(authors, index, count, sort);
} }
public async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthorsByName(string name, int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthorsByName(
string name,
int index,
int count,
string sort = ""
)
{ {
var authors = Stub.Authors.Where(a => a.Name.Contains(name, StringComparison.OrdinalIgnoreCase) var authors = Stub.Authors.Where(
|| a.AlternateNames.Exists(alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase))); a =>
a.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| a.AlternateNames.Exists(
alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)
)
);
return await OrderAuthors(authors, index, count, sort); return await OrderAuthors(authors, index, count, sort);
} }
@ -111,9 +140,14 @@ public class Stub : IDtoManager
return Task.FromResult(book); return Task.FromResult(book);
} }
private Task<Tuple<long, IEnumerable<BookDTO>>> OrderBooks(IEnumerable<BookDTO> books, int index, int count, string sort = "") private Task<Tuple<long, IEnumerable<BookDTO>>> OrderBooks(
IEnumerable<BookDTO> 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);
@ -127,12 +161,17 @@ public class Stub : IDtoManager
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))
);
} }
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooks(int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooks(
int index,
int count,
string sort = ""
)
{ {
var books = Stub.Books; var books = Stub.Books;
return await OrderBooks(books, index, count, sort); return await OrderBooks(books, index, count, sort);
@ -140,25 +179,48 @@ public class Stub : IDtoManager
public Task<BookDTO> GetBookByISBN(string isbn) public Task<BookDTO> GetBookByISBN(string isbn)
{ {
var book = Stub.Books.SingleOrDefault(b => b.ISBN13.Equals(isbn, StringComparison.OrdinalIgnoreCase)); var book = Stub.Books.SingleOrDefault(
b => b.ISBN13.Equals(isbn, StringComparison.OrdinalIgnoreCase)
);
return Task.FromResult(book); return Task.FromResult(book);
} }
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByTitle(string title, int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByTitle(
string title,
int index,
int count,
string sort = ""
)
{ {
var books = Stub.Books.Where(b => b.Title.Contains(title, StringComparison.OrdinalIgnoreCase) var books = Stub.Books.Where(
|| b.Series.Exists(s => s.Contains(title, StringComparison.OrdinalIgnoreCase))); b =>
b.Title.Contains(title, StringComparison.OrdinalIgnoreCase)
|| b.Series.Exists(s => s.Contains(title, StringComparison.OrdinalIgnoreCase))
);
return await OrderBooks(books, index, count, sort); return await OrderBooks(books, index, count, sort);
} }
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthorId(string authorId, int index, int count, string sort = "") public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthorId(
string authorId,
int index,
int count,
string sort = ""
)
{ {
var books = Stub.Books.Where(b => b.Authors.Exists(a => a.Id.Contains(authorId)) var books = Stub.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 await OrderBooks(books, index, count, sort); return await OrderBooks(books, index, count, sort);
} }
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthor(string name, int index, int count, string 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)); var books = Stub.Books.Where(b => ContainsAuthorName(b, name));
return await OrderBooks(books, index, count, sort); return await OrderBooks(books, index, count, sort);
@ -168,20 +230,24 @@ public class Stub : IDtoManager
{ {
IEnumerable<AuthorDTO> authors = new List<AuthorDTO>(); IEnumerable<AuthorDTO> authors = new List<AuthorDTO>();
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;
} }
@ -192,17 +258,13 @@ public class Stub : IDtoManager
public Task<Tuple<long, IEnumerable<WorkDTO>>> GetWorks(int index, int count) public Task<Tuple<long, IEnumerable<WorkDTO>>> GetWorks(int index, int count)
{ {
long nbWorks = Stub.Works.Count; long nbWorks = Stub.Works.Count;
var works = Stub.Works.Skip(index*count).Take(count); var works = Stub.Works.Skip(index * count).Take(count);
return Task.FromResult(Tuple.Create(nbWorks, works)); return Task.FromResult(Tuple.Create(nbWorks, works));
} }
public Task<long> GetNbAuthors() public Task<long> GetNbAuthors() => Task.FromResult((long)Stub.Authors.Count);
=> Task.FromResult((long)Stub.Authors.Count);
public Task<long> GetNbBooks() public Task<long> GetNbBooks() => Task.FromResult((long)Stub.Books.Count);
=> Task.FromResult((long)Stub.Books.Count);
public Task<long> GetNbWorks() public Task<long> GetNbWorks() => Task.FromResult((long)Stub.Works.Count);
=> 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,36 +64,44 @@ 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();

@ -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; } =
public ObservableCollection<Author> authorList { get; private set; } = new ObservableCollection<Author>(); new ObservableCollection<Author>();
public ObservableCollection<Book> bookList { get; private set; } = new ObservableCollection<Book>(); public ObservableCollection<Book> bookList { get; private set; } =
public ObservableCollection<AuteurGroup> AuteurGroups { get; private set; } = new ObservableCollection<AuteurGroup>(); new ObservableCollection<Book>();
public event PropertyChangedEventHandler PropertyChanged; public ObservableCollection<AuteurGroup> AuteurGroups { get; private set; } =
new ObservableCollection<AuteurGroup>();
public BookViewModel(ILibraryManager data) 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;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
public async Task<ObservableCollection<Book>> GetBooksByTitle()
{ {
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