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

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

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

@ -29,17 +29,30 @@ 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>>()
{ {
@ -51,7 +64,15 @@ 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;
@ -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 =>
new AuthorDTO
{ {
Id = $"/authors/{(string)doc["key"]}", Id = $"/authors/{(string)doc["key"]}",
Name = (string)doc["name"], Name = (string)doc["name"],
}); }
);
return Tuple.Create(numFound, authors); return Tuple.Create(numFound, authors);
} }
} }
} }

@ -52,7 +52,18 @@ public static class BookJsonReader
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)
@ -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 =>
new BookDTO
{ {
Id = (string)(doc["seed"].First()), Id = (string)(doc["seed"].First()),
Title = (string)doc["title"], Title = (string)doc["title"],
ISBN13 = (string)(doc["isbn"].First()), ISBN13 = (string)(doc["isbn"].First()),
Authors = doc["seed"].Where(s => ((string)s).StartsWith("/authors/")) Authors = doc["seed"]
.Select(s => new AuthorDTO { Id = (string)s }).ToList(), .Where(s => ((string)s).StartsWith("/authors/"))
.Select(s => new AuthorDTO { Id = (string)s })
.ToList(),
Language = languages.GetValueOrDefault((string)(doc["language"].First())) Language = languages.GetValueOrDefault((string)(doc["language"].First()))
}); }
);
return Tuple.Create(numFound, books); return Tuple.Create(numFound, books);
} }
@ -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 =>
new BookDTO
{ {
Id = (string)(doc["seed"].First()), Id = (string)(doc["seed"].First()),
Title = (string)doc["title"], Title = (string)doc["title"],
ISBN13 = (string)(doc["isbn"].First()), ISBN13 = (string)(doc["isbn"].First()),
Authors = doc["seed"].Where(s => ((string)s).StartsWith("/authors/")) Authors = doc["seed"]
.Select(s => new AuthorDTO { Id = (string)s }).ToList(), .Where(s => ((string)s).StartsWith("/authors/"))
.Select(s => new AuthorDTO { Id = (string)s })
.ToList(),
Language = languages.GetValueOrDefault((string)(doc["language"].First())) Language = languages.GetValueOrDefault((string)(doc["language"].First()))
}); }
);
return Tuple.Create(numFound, books); return Tuple.Create(numFound, books);
} }
} }

@ -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,13 +1,17 @@
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 =>
$"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-M.jpg";
public string ImageLarge =>
$"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-L.jpg";
public string Bio { get; set; } public string Bio { get; set; }
public List<string> AlternateNames { get; set; } = new List<string>(); public List<string> AlternateNames { get; set; } = new List<string>();
public List<LinkDTO> Links { get; set; } public List<LinkDTO> Links { get; set; }
@ -15,4 +19,3 @@ namespace LibraryDTO
public DateTime? DeathDate { get; set; } public DateTime? DeathDate { get; set; }
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class BookDTO public class BookDTO
@ -20,4 +21,3 @@ namespace LibraryDTO
public List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>(); public List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>();
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class ContributorDTO public class ContributorDTO
@ -7,4 +8,3 @@ namespace LibraryDTO
public string Role { get; set; } public string Role { get; set; }
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public enum Languages public enum Languages
@ -8,4 +9,3 @@ namespace LibraryDTO
English English
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class LinkDTO public class LinkDTO
@ -7,4 +8,3 @@ namespace LibraryDTO
public string Url { get; set; } public string Url { get; set; }
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class RatingsDTO public class RatingsDTO
@ -7,4 +8,3 @@ namespace LibraryDTO
public int Count { get; set; } public int Count { get; set; }
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace LibraryDTO namespace LibraryDTO
{ {
public class WorkDTO public class WorkDTO
@ -11,4 +12,3 @@ namespace LibraryDTO
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 =>
$"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-M.jpg";
public string ImageLarge =>
$"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-L.jpg";
public string Bio { get; set; } public string Bio { get; set; }
public List<string> AlternateNames { get; set; } = new List<string>(); public List<string> AlternateNames { get; set; } = new List<string>();
public List<Link> Links { get; set; } public List<Link> Links { get; set; }
public DateTime? BirthDate { get; set; } public DateTime? BirthDate { get; set; }
public DateTime? DeathDate { 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 true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Author); return Equals(obj as Author);
} }
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode();
} }
} }

@ -24,18 +24,18 @@ public class Book : IEquatable<Book>
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();
} }

@ -11,19 +11,19 @@ namespace Model
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 true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Borrowing); return Equals(obj as Borrowing);
} }
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode();
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public class Contact : IEquatable<Contact> public class Contact : IEquatable<Contact>
@ -7,19 +8,19 @@ namespace Model
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 true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Contact); return Equals(obj as Contact);
} }
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode();
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public class Contributor public class Contributor
@ -7,4 +8,3 @@ namespace Model
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,9 +1,14 @@
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,
int count,
string sort = ""
);
Task<Book> AddBook(Book book); Task<Book> AddBook(Book book);
Task<Book> AddBook(string id); Task<Book> AddBook(string id);
@ -34,7 +39,5 @@ namespace Model
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,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public enum Languages public enum Languages
@ -8,4 +9,3 @@ namespace Model
English English
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public class Link public class Link
@ -7,4 +8,3 @@ namespace Model
public string Url { get; set; } public string Url { get; set; }
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public class Loan : IEquatable<Loan> //prêt public class Loan : IEquatable<Loan> //prêt
@ -9,19 +10,19 @@ namespace Model
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 true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Loan); return Equals(obj as Loan);
} }
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode();
} }
} }

@ -19,34 +19,53 @@ namespace Model
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(string title, int index, int count, string sort = "") public async Task<(long count, IEnumerable<Book> books)> GetBooksByTitle(
string title,
int index,
int count,
string sort = ""
)
{ {
var result = await LibraryManager.GetBooksByTitle(title, index, count, sort); var result = await LibraryManager.GetBooksByTitle(title, index, count, sort);
return (result.Item1, result.Item2); return (result.Item1, result.Item2);
} }
public async Task<(long count, IEnumerable<Book> books)> GetBooksByAuthorId(string authorId, int index, int count, string sort = "") public async Task<(long count, IEnumerable<Book> books)> GetBooksByAuthorId(
string authorId,
int index,
int count,
string sort = ""
)
{ {
var result = await LibraryManager.GetBooksByAuthorId(authorId, index, count, sort); var result = await LibraryManager.GetBooksByAuthorId(authorId, index, count, sort);
return (result.Item1, result.Item2); return (result.Item1, result.Item2);
} }
public async Task<(long count, IEnumerable<Book> books)> GetBooksByAuthor(string author, int index, int count, string sort = "") public async Task<(long count, IEnumerable<Book> books)> GetBooksByAuthor(
string author,
int index,
int count,
string sort = ""
)
{ {
var result = await LibraryManager.GetBooksByAuthor(author, index, count, sort); var result = await LibraryManager.GetBooksByAuthor(author, index, count, sort);
return (result.Item1, result.Item2); return (result.Item1, result.Item2);
} }
public async Task<Author> GetAuthorById(string id) public async Task<Author> GetAuthorById(string id) =>
=> await LibraryManager.GetAuthorById(id); 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<Author> authors)> GetAuthorsByName(
string substring,
int index,
int count,
string sort = ""
)
{ {
var result = await LibraryManager.GetAuthorsByName(substring, index, count, sort); var result = await LibraryManager.GetAuthorsByName(substring, index, count, sort);
return (result.Item1, result.Item2); return (result.Item1, result.Item2);
@ -57,16 +76,19 @@ namespace Model
return UserLibraryManager.AddBook(id); return UserLibraryManager.AddBook(id);
} }
public async Task<Book> GetBookByIdFromCollection(string id) public async Task<Book> GetBookByIdFromCollection(string id) =>
=> await UserLibraryManager.GetBookById(id); await UserLibraryManager.GetBookById(id);
public Task<Book> UpdateBook(Book book) public Task<Book> UpdateBook(Book book)
{ {
return UserLibraryManager.UpdateBook(book); return UserLibraryManager.UpdateBook(book);
} }
public Task<(long count, IEnumerable<Book> books)> GetBooksFromCollection(int index, int count, string sort = "") public Task<(long count, IEnumerable<Book> books)> GetBooksFromCollection(
int index,
int count,
string sort = ""
)
{ {
var result = UserLibraryManager.GetBooksFromCollection(index, count, sort).Result; var result = UserLibraryManager.GetBooksFromCollection(index, count, sort).Result;
return Task.FromResult((result.Item1, result.Item2)); return Task.FromResult((result.Item1, result.Item2));
@ -90,17 +112,22 @@ namespace Model
return Task.FromResult((result.Item1, result.Item2)); return Task.FromResult((result.Item1, result.Item2));
} }
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetCurrentBorrowings(int index, int count) public Task<(long count, IEnumerable<Borrowing> borrowings)> GetCurrentBorrowings(
int index,
int count
)
{ {
var result = UserLibraryManager.GetCurrentBorrowings(index, count).Result; var result = UserLibraryManager.GetCurrentBorrowings(index, count).Result;
return Task.FromResult((result.Item1, result.Item2)); return Task.FromResult((result.Item1, result.Item2));
} }
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetPastBorrowings(int index, int count) public Task<(long count, IEnumerable<Borrowing> borrowings)> GetPastBorrowings(
int index,
int count
)
{ {
var result = UserLibraryManager.GetPastBorrowings(index, count).Result; var result = UserLibraryManager.GetPastBorrowings(index, count).Result;
return Task.FromResult((result.Item1, result.Item2)); return Task.FromResult((result.Item1, result.Item2));
} }
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public class Person public class Person
@ -7,4 +8,3 @@ namespace Model
public string Name { get; set; } public string Name { get; set; }
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public class Ratings public class Ratings
@ -7,4 +8,3 @@ namespace Model
public int Count { get; set; } public int Count { get; set; }
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public enum Status public enum Status
@ -10,4 +11,3 @@ namespace Model
ToBeRead ToBeRead
} }
} }

@ -1,4 +1,5 @@
using System; using System;
namespace Model namespace Model
{ {
public class Work : IEquatable<Work> public class Work : IEquatable<Work>
@ -10,19 +11,19 @@ namespace Model
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 true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Work); return Equals(obj as Work);
} }
public override int GetHashCode() public override int GetHashCode() => Id.GetHashCode();
=> Id.GetHashCode();
} }
} }

@ -5,14 +5,15 @@ 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 TModel : Enum
where TDTO : Enum where TDTO : Enum
{ {
foreach (var prop in typeof(EnumsMapper).GetProperties()) foreach (var prop in typeof(EnumsMapper).GetProperties())
@ -25,10 +26,11 @@ 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 TModel : Enum
where TDTO : Enum where TDTO : Enum
{ {
foreach (var prop in typeof(EnumsMapper).GetProperties()) foreach (var prop in typeof(EnumsMapper).GetProperties())
@ -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);
} }
} }

@ -7,20 +7,23 @@ 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 IEnumerable<Contributor> ToPocos(this IEnumerable<ContributorDTO> dtos) =>
dtos.Select(dto => dto.ToPoco());
public static Link ToPoco(this LinkDTO dto) =>
new Link { Title = dto.Title, Url = dto.Url };
public static IEnumerable<Link> ToPocos(this IEnumerable<LinkDTO> dtos) =>
dtos.Select(dto => dto.ToPoco());
public static Author ToPoco(this AuthorDTO dto) public static Author ToPoco(this AuthorDTO dto)
{ {
@ -40,8 +43,9 @@ namespace Stub
} }
return result; return result;
} }
public static IEnumerable<Author> ToPocos(this IEnumerable<AuthorDTO> dtos)
=> dtos.Select(dto => dto.ToPoco()); public static IEnumerable<Author> ToPocos(this IEnumerable<AuthorDTO> dtos) =>
dtos.Select(dto => dto.ToPoco());
public static Work ToPoco(this WorkDTO dto) public static Work ToPoco(this WorkDTO dto)
{ {
@ -60,8 +64,9 @@ namespace Stub
} }
return result; return result;
} }
public static IEnumerable<Work> ToPocos(this IEnumerable<WorkDTO> dtos)
=> dtos.Select(dto => dto.ToPoco()); public static IEnumerable<Work> ToPocos(this IEnumerable<WorkDTO> dtos) =>
dtos.Select(dto => dto.ToPoco());
public static Book ToPoco(this BookDTO dto) public static Book ToPoco(this BookDTO dto)
{ {
@ -86,8 +91,8 @@ namespace Stub
} }
return result; return result;
} }
public static IEnumerable<Book> ToPocos(this IEnumerable<BookDTO> dtos)
=> dtos.Select(dto => dto.ToPoco()); 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());
} }
} }

@ -9,7 +9,8 @@ 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();
} }
} }
} }

@ -35,13 +35,26 @@ 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
new Contact { Id = "/contacts/02", FirstName = "Malika", LastName = "More" }, {
Id = "/contacts/01",
FirstName = "Audrey",
LastName = "Pouclet"
},
new Contact
{
Id = "/contacts/02",
FirstName = "Malika",
LastName = "More"
},
new Contact { Id = "/contacts/03", FirstName = "Antoine" }, new Contact { Id = "/contacts/03", FirstName = "Antoine" },
}); }
books.AddRange(new Book[] );
books.AddRange(
new Book[]
{ {
LibraryMgr.GetBookById("/books/OL25910297M").Result, LibraryMgr.GetBookById("/books/OL25910297M").Result,
LibraryMgr.GetBookById("/books/OL26210208M").Result, LibraryMgr.GetBookById("/books/OL26210208M").Result,
@ -54,23 +67,43 @@ namespace StubLib
LibraryMgr.GetBookById("/books/OL38586212M").Result, LibraryMgr.GetBookById("/books/OL38586212M").Result,
LibraryMgr.GetBookById("/books/OL8839071M").Result, LibraryMgr.GetBookById("/books/OL8839071M").Result,
LibraryMgr.GetBookById("/books/OL8198056M").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,33 +115,45 @@ 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], Id = "/borrowing/01",
Owner = contacts[0],
Book = LibraryMgr.GetBookById("/books/OL27328194M").Result, Book = LibraryMgr.GetBookById("/books/OL27328194M").Result,
BorrowedAt = new DateTime(2023, 9, 7) BorrowedAt = new DateTime(2023, 9, 7)
}); }
borrowings.Add(new Borrowing );
borrowings.Add(
new Borrowing
{ {
Id = "/borrowing/02", Owner = contacts[1], Id = "/borrowing/02",
Owner = contacts[1],
Book = LibraryMgr.GetBookById("/books/OL27989051M").Result, Book = LibraryMgr.GetBookById("/books/OL27989051M").Result,
BorrowedAt = new DateTime(2022, 7, 7), BorrowedAt = new DateTime(2022, 7, 7),
ReturnedAt = new DateTime(2023, 3, 1) ReturnedAt = new DateTime(2023, 3, 1)
}); }
borrowings.Add(new Borrowing );
borrowings.Add(
new Borrowing
{ {
Id = "/borrowing/03", Owner = contacts[1], Id = "/borrowing/03",
Owner = contacts[1],
Book = LibraryMgr.GetBookById("/books/OL35698073M").Result, Book = LibraryMgr.GetBookById("/books/OL35698073M").Result,
BorrowedAt = new DateTime(2022, 7, 7), BorrowedAt = new DateTime(2022, 7, 7),
ReturnedAt = new DateTime(2022, 9, 1) ReturnedAt = new DateTime(2022, 9, 1)
}); }
borrowings.Add(new Borrowing );
borrowings.Add(
new Borrowing
{ {
Id = "/borrowing/04", Owner = contacts[1], Id = "/borrowing/04",
Owner = contacts[1],
Book = LibraryMgr.GetBookById("/books/OL35698083M").Result, Book = LibraryMgr.GetBookById("/books/OL35698083M").Result,
BorrowedAt = new DateTime(2022, 7, 7), BorrowedAt = new DateTime(2022, 7, 7),
ReturnedAt = new DateTime(2023, 8, 30) ReturnedAt = new DateTime(2023, 8, 30)
}); }
);
} }
public Task<Book> AddBook(Book book) public Task<Book> AddBook(Book book)
@ -219,7 +264,12 @@ namespace StubLib
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
{
Book = book,
Loaner = contact,
LoanedAt = loanDate.GetValueOrDefault(DateTime.Now)
};
if (Loans.Contains(loan)) if (Loans.Contains(loan))
return Task.FromResult(false); return Task.FromResult(false);
loans.Add(loan); loans.Add(loan);
@ -243,7 +293,12 @@ namespace StubLib
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
{
Book = book,
Owner = owner,
BorrowedAt = borrowedDate.GetValueOrDefault(DateTime.Now)
};
if (Borrowings.Contains(borrow)) if (Borrowings.Contains(borrow))
return Task.FromResult(false); return Task.FromResult(false);
borrowings.Add(borrow); borrowings.Add(borrow);
@ -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,7 +380,12 @@ 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)
{ {
@ -316,13 +396,25 @@ 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);
} }
@ -337,7 +429,12 @@ 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)
{ {
@ -353,9 +450,10 @@ 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)
@ -374,8 +472,12 @@ namespace StubLib
} }
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,7 +19,9 @@ 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))
@ -28,9 +30,13 @@ public class Stub : IDtoManager
} }
} }
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))
@ -49,7 +55,9 @@ public class Stub : IDtoManager
} }
} }
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))
@ -78,7 +86,12 @@ 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)
{ {
@ -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,7 +140,12 @@ 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)
{ {
@ -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);
@ -180,8 +242,12 @@ public class Stub : IDtoManager
} }
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;
} }
@ -196,13 +262,9 @@ public class Stub : IDtoManager
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);
} }

@ -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 !";
@ -65,7 +66,9 @@ 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();
@ -74,7 +77,9 @@ 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();
@ -83,7 +88,9 @@ 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();
@ -92,7 +99,9 @@ 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,7 +4,8 @@ using System.Linq;
namespace Utils namespace Utils
{ {
public class EnumsMapper<T, U> where T : Enum public class EnumsMapper<T, U>
where T : Enum
where U : 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>>();
@ -48,4 +49,3 @@ namespace Utils
} }
} }
} }

@ -4,7 +4,8 @@ using System.Linq;
namespace Utils namespace Utils
{ {
public class Mapper<T, U> where T : class public class Mapper<T, U>
where T : class
where U : 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>>();
@ -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
}
public class AuteurGroup : ObservableCollection<Book>
{ {
public string Name { get; private set; } var (totalA, authors) = await data.GetAuthorsByName("", 0, 5);
public AuteurGroup(string name, ObservableCollection<Book> books): base(books) foreach (Author author in authors)
{ {
Name = name; 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)
public void GetBooks()
{ {
var objet = data.GetBooksByAuthor("", 0, 8); System.Diagnostics.Debug.WriteLine(ex.Message);
var ojb = objet.Result.Item2; }
}
/*foreach (Book Book in ojb) public class AuteurGroup : ObservableCollection<Book>
{ {
AuteurGroups.Add(new AuteurGroup(Book.Authors.Name, auteur.Books)); public string Name { get; private set; }
}
ObservableCollection<Auteur> auteurs = new Stub().CreateStubData(); public AuteurGroup(string name, ObservableCollection<Book> books)
foreach (Auteur auteur in auteurs) : base(books)
{ {
AuteurGroups.Add(new AuteurGroup(auteur.Name, auteur.Books)); Name = name;
} }
*/
} }
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