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<CollectionFiltrage>();
// transient pour recharger la data à l'execute
return builder.Build();

@ -5,11 +5,8 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
namespace BookApp.ViewModel;
public class ViewModelManager
{
BookViewModel _viewModel;
public ObservableCollection<Author> Authors { get; set; } = new ObservableCollection<Author>();
@ -18,7 +15,6 @@ public class ViewModelManager
public ViewModelManager(BookViewModel viewModel)
{
_viewModel = viewModel;
//GetAuthors();
/* ObservableCollection<Auteur> auteurs = new Stub().CreateStubData();

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

@ -36,7 +36,12 @@ public interface IDtoManager
/// </ul>
/// </param>
/// <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>
/// get books of a particular author by giving the author id
@ -53,7 +58,12 @@ public interface IDtoManager
/// </ul>
/// </param>
/// <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>
/// get books of authors whose name (or alternate names) contains a particular substring
@ -70,7 +80,12 @@ public interface IDtoManager
/// </ul>
/// </param>
/// <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>
/// get an author by specifying its id
@ -92,6 +107,10 @@ public interface IDtoManager
/// </ul>
/// </param>
/// <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"],
Name = (string)o["name"],
Bio = bioTokenAsString,
BirthDate = o.TryGetValue("birth_date", out JToken? bd) ? ReadDate((string)o["birth_date"]) : null,
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?>()
BirthDate = o.TryGetValue("birth_date", out JToken? bd)
? ReadDate((string)o["birth_date"])
: null,
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;
}
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>>()
{
@ -51,7 +64,15 @@ namespace JsonReader
DateTime? publishDate = null;
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;
break;
@ -68,13 +89,15 @@ namespace JsonReader
{
JObject o = JObject.Parse(json);
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"]}",
Name = (string)doc["name"],
});
}
);
return Tuple.Create(numFound, authors);
}
}
}

@ -52,7 +52,18 @@ public static class BookJsonReader
Language = lang,
Format = o.TryGetValue("physical_format", out JToken? f) ? (string)f : null,
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()
};
if (book.Authors == null)
@ -66,15 +77,20 @@ public static class BookJsonReader
{
JObject o = JObject.Parse(json);
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()),
Title = (string)doc["title"],
ISBN13 = (string)(doc["isbn"].First()),
Authors = doc["seed"].Where(s => ((string)s).StartsWith("/authors/"))
.Select(s => new AuthorDTO { Id = (string)s }).ToList(),
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);
}
@ -82,16 +98,20 @@ public static class BookJsonReader
{
JObject o = JObject.Parse(json);
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()),
Title = (string)doc["title"],
ISBN13 = (string)(doc["isbn"].First()),
Authors = doc["seed"].Where(s => ((string)s).StartsWith("/authors/"))
.Select(s => new AuthorDTO { Id = (string)s }).ToList(),
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);
}
}

@ -43,13 +43,18 @@ namespace JsonReader
{
Id = (string)o["key"],
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,
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
};
return work;
}
}
}

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

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

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

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

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

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

@ -1,4 +1,5 @@
using System;
namespace LibraryDTO
{
public class WorkDTO
@ -11,4 +12,3 @@ namespace LibraryDTO
public RatingsDTO Ratings { get; set; }
}
}

@ -1,32 +1,36 @@
using System;
namespace Model
{
public class Author : IEquatable<Author>
{
public string Id { get; set; }
public string Name { get; set; }
public string ImageSmall => $"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-S.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 ImageSmall =>
$"https://covers.openlibrary.org/a/olid/{Id.Substring(Id.LastIndexOf("/"))}-S.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 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)
=> Id == other.Id;
public bool Equals(Author? other) => Id == other.Id;
public override bool Equals(object? obj)
{
if(ReferenceEquals(obj, null)) return false;
if(ReferenceEquals(this, obj)) return true;
if(GetType() != obj.GetType()) return false;
if (ReferenceEquals(obj, null))
return false;
if (ReferenceEquals(this, obj))
return true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Author);
}
public override int GetHashCode()
=> Id.GetHashCode();
public override int GetHashCode() => Id.GetHashCode();
}
}

@ -24,18 +24,18 @@ public class Book : IEquatable<Book>
public float? UserRating { get; set; }
public string UserNote { get; set; }
public bool Equals(Book? other)
=> Id == other.Id;
public bool Equals(Book? other) => Id == other.Id;
public override bool Equals(object? obj)
{
if(ReferenceEquals(obj, null)) return false;
if(ReferenceEquals(this, obj)) return true;
if(GetType() != obj.GetType()) return false;
if (ReferenceEquals(obj, null))
return false;
if (ReferenceEquals(this, obj))
return true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Book);
}
public override int GetHashCode()
=> Id.GetHashCode();
public override int GetHashCode() => Id.GetHashCode();
}

@ -11,19 +11,19 @@ namespace Model
public DateTime BorrowedAt { get; set; }
public DateTime? ReturnedAt { get; set; }
public bool Equals(Borrowing? other)
=> Id == other.Id;
public bool Equals(Borrowing? other) => Id == other.Id;
public override bool Equals(object? obj)
{
if(ReferenceEquals(obj, null)) return false;
if(ReferenceEquals(this, obj)) return true;
if(GetType() != obj.GetType()) return false;
if (ReferenceEquals(obj, null))
return false;
if (ReferenceEquals(this, obj))
return true;
if (GetType() != obj.GetType())
return false;
return Equals(obj as Borrowing);
}
public override int GetHashCode()
=> Id.GetHashCode();
public override int GetHashCode() => Id.GetHashCode();
}
}

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

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

@ -1,15 +1,35 @@
using System;
namespace Model
{
public interface ILibraryManager
{
Task<Book> GetBookById(string id);
Task<Book> GetBookByISBN(string isbn);
Task<Tuple<long, IEnumerable<Book>>> GetBooksByTitle(string title, 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<Tuple<long, IEnumerable<Book>>> GetBooksByTitle(
string title,
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<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;
namespace Model
{
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(string id);
@ -34,7 +39,5 @@ namespace Model
Task<Tuple<long, IEnumerable<Borrowing>>> GetPastBorrowings(int index, int count);
Task<Tuple<long, IEnumerable<Contact>>> GetContacts(int index, int count);
}
}

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

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

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

@ -19,34 +19,53 @@ namespace Model
Books = new ReadOnlyCollection<Book>(books);
}
public async Task<Book> GetBookById(string id)
=> await LibraryManager.GetBookById(id);
public async Task<Book> GetBookById(string id) => await LibraryManager.GetBookById(id);
public async Task<Book> GetBookByISBN(string isbn)
=> await LibraryManager.GetBookByISBN(isbn);
public async Task<Book> GetBookByISBN(string 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);
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);
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);
return (result.Item1, result.Item2);
}
public async Task<Author> GetAuthorById(string id)
=> await LibraryManager.GetAuthorById(id);
public async Task<Author> GetAuthorById(string 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);
return (result.Item1, result.Item2);
@ -57,16 +76,19 @@ namespace Model
return UserLibraryManager.AddBook(id);
}
public async Task<Book> GetBookByIdFromCollection(string id)
=> await UserLibraryManager.GetBookById(id);
public async Task<Book> GetBookByIdFromCollection(string id) =>
await UserLibraryManager.GetBookById(id);
public Task<Book> UpdateBook(Book 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;
return Task.FromResult((result.Item1, result.Item2));
@ -90,17 +112,22 @@ namespace Model
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;
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;
return Task.FromResult((result.Item1, result.Item2));
}
}
}

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

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

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

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

@ -5,14 +5,15 @@ namespace Stub
{
static class EnumsMapper
{
public static EnumsMapper<Model.Languages, LibraryDTO.Languages> BiddingsMapper { get; }
= new EnumsMapper<Model.Languages, LibraryDTO.Languages>(
public static EnumsMapper<Model.Languages, LibraryDTO.Languages> BiddingsMapper { get; } =
new EnumsMapper<Model.Languages, LibraryDTO.Languages>(
Tuple.Create(Model.Languages.Unknown, LibraryDTO.Languages.Unknown),
Tuple.Create(Model.Languages.French, LibraryDTO.Languages.French),
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
{
foreach (var prop in typeof(EnumsMapper).GetProperties())
@ -25,10 +26,11 @@ namespace Stub
return default(TModel);
}
public static Model.Languages ToModel(this LibraryDTO.Languages dto)
=> ToModel<Model.Languages, LibraryDTO.Languages>(dto);
public static Model.Languages ToModel(this 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
{
foreach (var prop in typeof(EnumsMapper).GetProperties())
@ -41,9 +43,7 @@ namespace Stub
return default(TDTO);
}
public static LibraryDTO.Languages ToDTO(this Model.Languages model)
=> ToDTO<Model.Languages, LibraryDTO.Languages>(model);
public static LibraryDTO.Languages ToDTO(this Model.Languages model) =>
ToDTO<Model.Languages, LibraryDTO.Languages>(model);
}
}

@ -7,20 +7,23 @@ namespace Stub
{
public static class Extensions
{
public static Ratings ToPoco(this RatingsDTO dto)
=> new Ratings() { Average = dto.Average, Count = dto.Count };
public static IEnumerable<Ratings> ToPocos(this IEnumerable<RatingsDTO> dtos)
=> dtos.Select(dto => dto.ToPoco());
public static Ratings ToPoco(this RatingsDTO dto) =>
new Ratings() { Average = dto.Average, Count = dto.Count };
public static Contributor ToPoco(this ContributorDTO dto)
=> new Contributor { Name = dto.Name, Role = dto.Role };
public static IEnumerable<Contributor> ToPocos(this IEnumerable<ContributorDTO> dtos)
=> dtos.Select(dto => dto.ToPoco());
public static IEnumerable<Ratings> ToPocos(this IEnumerable<RatingsDTO> 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 Contributor ToPoco(this ContributorDTO dto) =>
new Contributor { Name = dto.Name, Role = dto.Role };
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)
{
@ -40,8 +43,9 @@ namespace Stub
}
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)
{
@ -60,8 +64,9 @@ namespace Stub
}
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)
{
@ -86,8 +91,8 @@ namespace Stub
}
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();
}
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);
return Tuple.Create(result.Item1, result.Item2.ToPocos());
@ -28,22 +33,36 @@ public class LibraryStub : ILibraryManager
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);
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);
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);
return Tuple.Create(result.Item1, result.Item2.ToPocos());
}
}

@ -9,7 +9,8 @@ namespace Stub
{
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<Book, BookDTO> BooksMapper { get; } = new Mapper<Book, BookDTO>();
@ -20,6 +21,4 @@ namespace Stub
BooksMapper.Reset();
}
}
}

@ -35,13 +35,26 @@ namespace StubLib
Loans = new ReadOnlyCollection<Loan>(loans);
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
{
Id = "/contacts/01",
FirstName = "Audrey",
LastName = "Pouclet"
},
new Contact
{
Id = "/contacts/02",
FirstName = "Malika",
LastName = "More"
},
new Contact { Id = "/contacts/03", FirstName = "Antoine" },
});
books.AddRange(new Book[]
}
);
books.AddRange(
new Book[]
{
LibraryMgr.GetBookById("/books/OL25910297M").Result,
LibraryMgr.GetBookById("/books/OL26210208M").Result,
@ -54,23 +67,43 @@ namespace StubLib
LibraryMgr.GetBookById("/books/OL38586212M").Result,
LibraryMgr.GetBookById("/books/OL8839071M").Result,
LibraryMgr.GetBookById("/books/OL8198056M").Result,
});
}
);
books[0].Status = Status.Finished;
books[0].UserNote = "Super bouquin de SF !";
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[2].Status = Status.Finished;
books[2].UserNote = "Des nouvelles de SF. Super auteur à découvrir !";
books[2].UserRating = 4.8f;
books[3].Status = Status.Finished;
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].UserNote = "Déjà moins connu que le premier, et pourtant...";
books[4].UserRating = 4.2f;
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[6].Status = Status.NotRead;
books[7].Status = Status.Finished;
@ -82,33 +115,45 @@ namespace StubLib
books[9].Status = Status.ToBeRead;
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,
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,
BorrowedAt = new DateTime(2022, 7, 7),
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,
BorrowedAt = new DateTime(2022, 7, 7),
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,
BorrowedAt = new DateTime(2022, 7, 7),
ReturnedAt = new DateTime(2023, 8, 30)
});
}
);
}
public Task<Book> AddBook(Book book)
@ -219,7 +264,12 @@ namespace StubLib
return Task.FromResult(false);
if (!Contacts.Contains(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))
return Task.FromResult(false);
loans.Add(loan);
@ -243,7 +293,12 @@ namespace StubLib
return Task.FromResult(false);
if (!Contacts.Contains(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))
return Task.FromResult(false);
borrowings.Add(borrow);
@ -271,20 +326,40 @@ namespace StubLib
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);
}
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))
|| b.Works.Exists(w => w.Authors.Exists(a => a.Id.Contains(authorId))));
var foundBooks = Books.Where(
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);
}
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));
return OrderBooks(books, index, count, sort);
@ -305,7 +380,12 @@ namespace StubLib
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)
{
@ -316,13 +396,25 @@ namespace StubLib
authors = authors.OrderByDescending(a => a.Name);
break;
}
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)
|| a.AlternateNames.Exists(alt => alt.Contains(substring, StringComparison.InvariantCultureIgnoreCase)));
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)
|| a.AlternateNames.Exists(
alt => alt.Contains(substring, StringComparison.InvariantCultureIgnoreCase)
)
);
return OrderAuthors(foundAuthors, index, count, sort);
}
@ -337,7 +429,12 @@ namespace StubLib
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)
{
@ -353,9 +450,10 @@ namespace StubLib
case "old":
books = books.OrderBy(b => b.PublishDate);
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)
@ -374,8 +472,12 @@ namespace StubLib
}
foreach (var author in authors)
{
if(author.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| author.AlternateNames.Exists(alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)))
if (
author.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| author.AlternateNames.Exists(
alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)
)
)
{
return true;
}
@ -383,7 +485,11 @@ namespace StubLib
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);
}
@ -391,31 +497,46 @@ namespace StubLib
public Task<Tuple<long, IEnumerable<Loan>>> GetCurrentLoans(int index, int count)
{
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)
{
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)
{
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)
{
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)
{
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()
{
foreach(var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("authors")))
foreach (
var resource in Assembly.GetManifestResourceNames().Where(n => n.Contains("authors"))
)
{
using (Stream stream = Assembly.GetManifestResourceStream(resource))
using (StreamReader reader = new StreamReader(stream))
@ -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 (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 (StreamReader reader = new StreamReader(stream))
@ -78,7 +86,12 @@ public class Stub : IDtoManager
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)
{
@ -89,19 +102,35 @@ public class Stub : IDtoManager
authors = authors.OrderByDescending(a => a.Name);
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;
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)
|| a.AlternateNames.Exists(alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)));
var authors = Stub.Authors.Where(
a =>
a.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| a.AlternateNames.Exists(
alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)
)
);
return await OrderAuthors(authors, index, count, sort);
}
@ -111,7 +140,12 @@ public class Stub : IDtoManager
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)
{
@ -127,12 +161,17 @@ public class Stub : IDtoManager
case "old":
books = books.OrderBy(b => b.PublishDate);
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;
return await OrderBooks(books, index, count, sort);
@ -140,25 +179,48 @@ public class Stub : IDtoManager
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);
}
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)
|| b.Series.Exists(s => s.Contains(title, StringComparison.OrdinalIgnoreCase)));
var books = Stub.Books.Where(
b =>
b.Title.Contains(title, StringComparison.OrdinalIgnoreCase)
|| b.Series.Exists(s => s.Contains(title, StringComparison.OrdinalIgnoreCase))
);
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))
|| b.Works.Exists(w => w.Authors.Exists(a => a.Id.Contains(authorId))));
var books = Stub.Books.Where(
b =>
b.Authors.Exists(a => a.Id.Contains(authorId))
|| b.Works.Exists(w => w.Authors.Exists(a => a.Id.Contains(authorId)))
);
return await OrderBooks(books, index, count, sort);
}
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthor(string name, int index, int count, string sort = "")
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthor(
string name,
int index,
int count,
string sort = ""
)
{
var books = Stub.Books.Where(b => ContainsAuthorName(b, name));
return await OrderBooks(books, index, count, sort);
@ -180,8 +242,12 @@ public class Stub : IDtoManager
}
foreach (var author in authors)
{
if(author.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| author.AlternateNames.Exists(alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)))
if (
author.Name.Contains(name, StringComparison.OrdinalIgnoreCase)
|| author.AlternateNames.Exists(
alt => alt.Contains(name, StringComparison.OrdinalIgnoreCase)
)
)
{
return true;
}
@ -196,13 +262,9 @@ public class Stub : IDtoManager
return Task.FromResult(Tuple.Create(nbWorks, works));
}
public Task<long> GetNbAuthors()
=> Task.FromResult((long)Stub.Authors.Count);
public Task<long> GetNbAuthors() => Task.FromResult((long)Stub.Authors.Count);
public Task<long> GetNbBooks()
=> Task.FromResult((long)Stub.Books.Count);
public Task<long> GetNbBooks() => Task.FromResult((long)Stub.Books.Count);
public Task<long> GetNbWorks()
=> Task.FromResult((long)Stub.Works.Count);
public Task<long> GetNbWorks() => Task.FromResult((long)Stub.Works.Count);
}

@ -36,7 +36,8 @@ WriteLine();
WriteLine("Test Manager.AddBook");
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.UserRating = 5;
book1.UserNote = "Trop bien !";
@ -65,7 +66,9 @@ WriteLine("Test Manager.GetCurrentLoans");
var loans = await manager.GetCurrentLoans(0, 100);
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();
@ -74,7 +77,9 @@ WriteLine("Test Manager.GetPastLoans");
var loans2 = await manager.GetPastLoans(0, 100);
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();
@ -83,7 +88,9 @@ WriteLine("Test Manager.GetCurrentBorrowings");
var borrowings = await manager.GetCurrentBorrowings(0, 100);
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();
@ -92,7 +99,9 @@ WriteLine("Test Manager.GetPastBorrowings");
var borrowings2 = await manager.GetPastBorrowings(0, 100);
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();

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

@ -4,7 +4,8 @@ using System.Linq;
namespace Utils
{
public class EnumsMapper<T, U> where T : Enum
public class EnumsMapper<T, U>
where T : Enum
where U : Enum
{
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
{
public class Mapper<T, U> where T : class
public class Mapper<T, U>
where T : class
where U : class
{
readonly HashSet<Tuple<T, U>> mapper = new HashSet<Tuple<T, U>>();
@ -37,10 +38,10 @@ namespace Utils
public bool AddMapping(T t, U u)
{
var mapping = new Tuple<T, U>(t, u);
if(mapper.Contains(mapping)) return false;
if (mapper.Contains(mapping))
return false;
mapper.Add(mapping);
return true;
}
}
}

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

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

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

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

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

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