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

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

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

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

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

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

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

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

@ -5,15 +5,15 @@ using System.Globalization;
namespace JsonReader
{
public static class AuthorJsonReader
{
public static class AuthorJsonReader
{
public static AuthorDTO ReadAuthor(string json)
{
JObject o = JObject.Parse(json);
string bioTokenAsString = null;
if(o.TryGetValue("bio", out JToken? bioToken))
if (o.TryGetValue("bio", out JToken? bioToken))
{
if(bioToken.Type == JTokenType.String)
if (bioToken.Type == JTokenType.String)
{
bioTokenAsString = (string)bioToken;
}
@ -29,19 +29,32 @@ 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>>()
List<Tuple<string, CultureInfo>> pubDateFormat = new List<Tuple<string, CultureInfo>>()
{
Tuple.Create("d MMMM yyyy", CultureInfo.GetCultureInfo("fr-FR")),
Tuple.Create("d MMMM yyyy", CultureInfo.InvariantCulture),
@ -49,15 +62,23 @@ namespace JsonReader
};
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;
break;
}
}
if(!publishDate.HasValue && int.TryParse(dateInJson, out int year))
if (!publishDate.HasValue && int.TryParse(dateInJson, out int year))
{
publishDate = new DateTime(year, 12, 31);
}
@ -68,13 +89,15 @@ namespace JsonReader
{
JObject o = JObject.Parse(json);
long numFound = (long)o["numFound"];
var authors = o["docs"].Select(doc => new AuthorDTO
{
Id = $"/authors/{(string)doc["key"]}",
Name = (string)doc["name"],
});
var authors = o["docs"].Select(
doc =>
new AuthorDTO
{
Id = $"/authors/{(string)doc["key"]}",
Name = (string)doc["name"],
}
);
return Tuple.Create(numFound, authors);
}
}
}
}

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

@ -5,14 +5,14 @@ using System.Globalization;
namespace JsonReader
{
public static class WorkJsonReader
{
public static WorkDTO ReadWork(string json, string ratingsJson)
public static class WorkJsonReader
{
public static WorkDTO ReadWork(string json, string ratingsJson)
{
JObject o = JObject.Parse(json);
JObject r = JObject.Parse(ratingsJson);
var ratingsDto = new RatingsDTO();
if(r["summary"]["average"].Type != JTokenType.Float)
if (r["summary"]["average"].Type != JTokenType.Float)
{
ratingsDto.Average = -1;
ratingsDto.Count = 0;
@ -24,9 +24,9 @@ namespace JsonReader
}
string description = null;
if(o.TryGetValue("description", out JToken? descr))
if (o.TryGetValue("description", out JToken? descr))
{
if(descr.Type == JTokenType.String)
if (descr.Type == JTokenType.String)
{
description = (string)descr;
}
@ -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,18 +1,21 @@
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 Bio { get; set; }
public List<string> AlternateNames { get; set; } = new List<string>();
public List<LinkDTO> Links { get; set; }
public DateTime? BirthDate { get; set; }
public DateTime? DeathDate { get; set; }
}
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 Bio { get; set; }
public List<string> AlternateNames { get; set; } = new List<string>();
public List<LinkDTO> Links { get; set; }
public DateTime? BirthDate { get; set; }
public DateTime? DeathDate { get; set; }
}
}

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

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

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

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

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

@ -1,14 +1,14 @@
using System;
namespace LibraryDTO
{
public class WorkDTO
{
public string Id { get; set; }
public string Description { get; set; }
public string Title { get; set; }
public List<string> Subjects { get; set; } = new List<string>();
public List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>();
public RatingsDTO Ratings { get; set; }
}
public class WorkDTO
{
public string Id { get; set; }
public string Description { get; set; }
public string Title { get; set; }
public List<string> Subjects { get; set; } = new List<string>();
public List<AuthorDTO> Authors { get; set; } = new List<AuthorDTO>();
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 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 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 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;
return Equals(obj as Author);
}
public override bool Equals(object? obj)
{
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();
}
}

@ -4,38 +4,38 @@ namespace Model;
public class Book : IEquatable<Book>
{
public string Id { get; set; }
public string Title { get; set; }
public List<string> Publishers { get; set; } = new List<string>();
public DateTime PublishDate { get; set; }
public string ISBN13 { get; set; }
public List<string> Series { get; set; } = new List<string>();
public int NbPages { get; set; }
public string Format { get; set; }
public Languages Language { get; set; }
public List<Contributor> Contributors { get; set; }
public string ImageSmall => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-S.jpg";
public string ImageMedium => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-M.jpg";
public string ImageLarge => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-L.jpg";
public string Id { get; set; }
public string Title { get; set; }
public List<string> Publishers { get; set; } = new List<string>();
public DateTime PublishDate { get; set; }
public string ISBN13 { get; set; }
public List<string> Series { get; set; } = new List<string>();
public int NbPages { get; set; }
public string Format { get; set; }
public Languages Language { get; set; }
public List<Contributor> Contributors { get; set; }
public string ImageSmall => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-S.jpg";
public string ImageMedium => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-M.jpg";
public string ImageLarge => $"https://covers.openlibrary.org/b/isbn/{ISBN13}-L.jpg";
public List<Work> Works { get; set; } = new List<Work>();
public List<Author> Authors { get; set; } = new List<Author>();
public Status Status { get; set; }
public List<string> UserTags { get; set; } = new List<string>();
public float? UserRating { get; set; }
public string UserNote { get; set; }
public List<Author> Authors { get; set; } = new List<Author>();
public Status Status { get; set; }
public List<string> UserTags { get; set; } = new List<string>();
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();
}

@ -3,27 +3,27 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Model
{
public class Borrowing : IEquatable<Borrowing> //emprunt
{
public string Id { get; set; }
public Book Book { get; set; }
public Contact Owner { get; set; }
public DateTime BorrowedAt { get; set; }
public DateTime? ReturnedAt { get; set; }
public class Borrowing : IEquatable<Borrowing> //emprunt
{
public string Id { get; set; }
public Book Book { get; set; }
public Contact Owner { get; set; }
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;
return Equals(obj as Borrowing);
}
public override bool Equals(object? obj)
{
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,25 +1,26 @@
using System;
namespace Model
{
public class Contact : IEquatable<Contact>
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public class Contact : IEquatable<Contact>
{
public string Id { get; set; }
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;
return Equals(obj as Contact);
}
public override bool Equals(object? obj)
{
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,10 +1,10 @@
using System;
namespace Model
{
public class Contributor
{
public string Name { get; set; }
public string Role { get; set; }
}
public class Contributor
{
public string Name { get; set; }
public string Role { get; set; }
}
}

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

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

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

@ -1,27 +1,28 @@
using System;
namespace Model
{
public class Loan : IEquatable<Loan> //prêt
{
public string Id { get; set; }
public Book Book { get; set; }
public Contact Loaner { get; set; }
public DateTime LoanedAt { get; set; }
public DateTime? ReturnedAt { get; set; }
public class Loan : IEquatable<Loan> //prêt
{
public string Id { get; set; }
public Book Book { get; set; }
public Contact Loaner { get; set; }
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;
return Equals(obj as Loan);
}
public override bool Equals(object? obj)
{
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();
}
}

@ -4,103 +4,130 @@ using System.Reflection;
namespace Model
{
public class Manager
{
private ILibraryManager LibraryManager { get; set; }
private IUserLibraryManager UserLibraryManager { get; set; }
public ReadOnlyCollection<Book> Books { get; private set; }
private List<Book> books = new();
public Manager(ILibraryManager libMgr, IUserLibraryManager userLibMgr)
{
LibraryManager = libMgr;
UserLibraryManager = userLibMgr;
Books = new ReadOnlyCollection<Book>(books);
}
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<(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 = "")
{
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 = "")
{
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<(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);
}
public Task<Book> AddBookToCollection(string id)
{
return UserLibraryManager.AddBook(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 = "")
{
var result = UserLibraryManager.GetBooksFromCollection(index, count, sort).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Contact> contacts)> GetContacts(int index, int count)
{
var result = UserLibraryManager.GetContacts(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Loan> loans)> GetCurrentLoans(int index, int count)
{
var result = UserLibraryManager.GetCurrentLoans(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Loan> loans)> GetPastLoans(int index, int count)
{
var result = UserLibraryManager.GetPastLoans(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetCurrentBorrowings(int index, int count)
{
var result = UserLibraryManager.GetCurrentBorrowings(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetPastBorrowings(int index, int count)
{
var result = UserLibraryManager.GetPastBorrowings(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
}
public class Manager
{
private ILibraryManager LibraryManager { get; set; }
private IUserLibraryManager UserLibraryManager { get; set; }
public ReadOnlyCollection<Book> Books { get; private set; }
private List<Book> books = new();
public Manager(ILibraryManager libMgr, IUserLibraryManager userLibMgr)
{
LibraryManager = libMgr;
UserLibraryManager = userLibMgr;
Books = new ReadOnlyCollection<Book>(books);
}
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<(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 = ""
)
{
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 = ""
)
{
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<(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);
}
public Task<Book> AddBookToCollection(string id)
{
return UserLibraryManager.AddBook(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 = ""
)
{
var result = UserLibraryManager.GetBooksFromCollection(index, count, sort).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Contact> contacts)> GetContacts(int index, int count)
{
var result = UserLibraryManager.GetContacts(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Loan> loans)> GetCurrentLoans(int index, int count)
{
var result = UserLibraryManager.GetCurrentLoans(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Loan> loans)> GetPastLoans(int index, int count)
{
var result = UserLibraryManager.GetPastLoans(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetCurrentBorrowings(
int index,
int count
)
{
var result = UserLibraryManager.GetCurrentBorrowings(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
public Task<(long count, IEnumerable<Borrowing> borrowings)> GetPastBorrowings(
int index,
int count
)
{
var result = UserLibraryManager.GetPastBorrowings(index, count).Result;
return Task.FromResult((result.Item1, result.Item2));
}
}
}

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

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

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

@ -1,28 +1,29 @@
using System;
namespace Model
{
public class Work : IEquatable<Work>
{
public string Id { get; set; }
public string Description { get; set; }
public string Title { get; set; }
public List<string> Subjects { get; set; } = new List<string>();
public List<Author> Authors { get; set; } = new List<Author>();
public Ratings Ratings { get; set; }
public class Work : IEquatable<Work>
{
public string Id { get; set; }
public string Description { get; set; }
public string Title { get; set; }
public List<string> Subjects { get; set; } = new List<string>();
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;
return Equals(obj as Work);
}
public override bool Equals(object? obj)
{
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();
}
}

@ -3,21 +3,22 @@ using Utils;
namespace Stub
{
static class EnumsMapper
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
where TDTO : Enum
public static TModel ToModel<TModel, TDTO>(this TDTO dto)
where TModel : Enum
where TDTO : Enum
{
foreach(var prop in typeof(EnumsMapper).GetProperties())
foreach (var prop in typeof(EnumsMapper).GetProperties())
{
if(prop.PropertyType.Equals(typeof(EnumsMapper<TModel, TDTO>)))
if (prop.PropertyType.Equals(typeof(EnumsMapper<TModel, TDTO>)))
{
return (prop.GetValue(null) as EnumsMapper<TModel, TDTO>).GetModel(dto);
}
@ -25,15 +26,16 @@ 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
where TDTO : Enum
public static TDTO ToDTO<TModel, TDTO>(this TModel model)
where TModel : Enum
where TDTO : Enum
{
foreach(var prop in typeof(EnumsMapper).GetProperties())
foreach (var prop in typeof(EnumsMapper).GetProperties())
{
if(prop.PropertyType.Equals(typeof(EnumsMapper<TModel, TDTO>)))
if (prop.PropertyType.Equals(typeof(EnumsMapper<TModel, TDTO>)))
{
return (prop.GetValue(null) as EnumsMapper<TModel, TDTO>).GetEntity(model);
}
@ -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);
}
}

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

@ -12,7 +12,12 @@ public class LibraryStub : ILibraryManager
return (await StubDTO.GetAuthorById(id)).ToPoco();
}
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());
}
}

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

@ -7,8 +7,8 @@ using System.Xml.Linq;
namespace StubLib
{
public class UserLibraryStub : IUserLibraryManager
{
public class UserLibraryStub : IUserLibraryManager
{
public ReadOnlyCollection<Book> Favorites { get; private set; }
private List<Book> favorites = new List<Book>();
@ -26,8 +26,8 @@ namespace StubLib
public ILibraryManager LibraryMgr { get; private set; }
public UserLibraryStub(ILibraryManager libraryMgr)
{
public UserLibraryStub(ILibraryManager libraryMgr)
{
LibraryMgr = libraryMgr;
Favorites = new ReadOnlyCollection<Book>(favorites);
Books = new ReadOnlyCollection<Book>(books);
@ -35,42 +35,75 @@ namespace StubLib
Loans = new ReadOnlyCollection<Loan>(loans);
Contacts = new ReadOnlyCollection<Contact>(contacts);
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/03", FirstName = "Antoine" },
});
books.AddRange(new Book[]
{
LibraryMgr.GetBookById("/books/OL25910297M").Result,
LibraryMgr.GetBookById("/books/OL26210208M").Result,
LibraryMgr.GetBookById("/books/OL27258011M").Result,
LibraryMgr.GetBookById("/books/OL28294024M").Result,
LibraryMgr.GetBookById("/books/OL28639494M").Result,
LibraryMgr.GetBookById("/books/OL35699439M").Result,
LibraryMgr.GetBookById("/books/OL37758347M").Result,
LibraryMgr.GetBookById("/books/OL38218739M").Result,
LibraryMgr.GetBookById("/books/OL38586212M").Result,
LibraryMgr.GetBookById("/books/OL8839071M").Result,
LibraryMgr.GetBookById("/books/OL8198056M").Result,
});
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/03", FirstName = "Antoine" },
}
);
books.AddRange(
new Book[]
{
LibraryMgr.GetBookById("/books/OL25910297M").Result,
LibraryMgr.GetBookById("/books/OL26210208M").Result,
LibraryMgr.GetBookById("/books/OL27258011M").Result,
LibraryMgr.GetBookById("/books/OL28294024M").Result,
LibraryMgr.GetBookById("/books/OL28639494M").Result,
LibraryMgr.GetBookById("/books/OL35699439M").Result,
LibraryMgr.GetBookById("/books/OL37758347M").Result,
LibraryMgr.GetBookById("/books/OL38218739M").Result,
LibraryMgr.GetBookById("/books/OL38586212M").Result,
LibraryMgr.GetBookById("/books/OL8839071M").Result,
LibraryMgr.GetBookById("/books/OL8198056M").Result,
}
);
books[0].Status = Status.Finished;
books[0].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,38 +115,50 @@ namespace StubLib
books[9].Status = Status.ToBeRead;
books[9].Status = Status.Reading;
borrowings.Add(new Borrowing
{
Id = "/borrowing/01", Owner = contacts[0],
Book = LibraryMgr.GetBookById("/books/OL27328194M").Result,
BorrowedAt = new DateTime(2023, 9, 7)
});
borrowings.Add(new Borrowing
{
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
{
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
{
Id = "/borrowing/04", Owner = contacts[1],
Book = LibraryMgr.GetBookById("/books/OL35698083M").Result,
BorrowedAt = new DateTime(2022, 7, 7),
ReturnedAt = new DateTime(2023, 8, 30)
});
}
borrowings.Add(
new Borrowing
{
Id = "/borrowing/01",
Owner = contacts[0],
Book = LibraryMgr.GetBookById("/books/OL27328194M").Result,
BorrowedAt = new DateTime(2023, 9, 7)
}
);
borrowings.Add(
new Borrowing
{
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
{
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
{
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)
{
if(Books.Contains(book))
if (Books.Contains(book))
{
return Task.FromResult<Book>(null);
}
@ -123,7 +168,7 @@ namespace StubLib
public async Task<Book> AddBook(string id)
{
if(Books.SingleOrDefault(b => b.Id == id) != null)
if (Books.SingleOrDefault(b => b.Id == id) != null)
{
return null;
}
@ -134,7 +179,7 @@ namespace StubLib
public async Task<Book> AddBookByIsbn(string isbn)
{
if(Books.SingleOrDefault(b => b.ISBN13 == isbn) != null)
if (Books.SingleOrDefault(b => b.ISBN13 == isbn) != null)
{
return null;
}
@ -160,12 +205,12 @@ namespace StubLib
public Task<bool> AddToFavorites(Book book)
{
if(Favorites.Contains(book))
if (Favorites.Contains(book))
{
return Task.FromResult(false);
}
var bookToAdd = Books.SingleOrDefault(b => b.Id == book.Id);
if(bookToAdd == null)
if (bookToAdd == null)
{
return Task.FromResult(false);
}
@ -175,12 +220,12 @@ namespace StubLib
public Task<bool> AddToFavorites(string bookId)
{
if(Favorites.SingleOrDefault(b => b.Id == bookId) != null)
if (Favorites.SingleOrDefault(b => b.Id == bookId) != null)
{
return Task.FromResult(false);
}
var book = Books.SingleOrDefault(b => b.Id == bookId);
if(book == null)
if (book == null)
{
return Task.FromResult(false);
}
@ -200,7 +245,7 @@ namespace StubLib
public Task<Contact> AddContact(Contact contact)
{
if(Contacts.Contains(contact))
if (Contacts.Contains(contact))
{
return Task.FromResult<Contact>(null);
}
@ -215,12 +260,17 @@ namespace StubLib
public Task<bool> LendBook(Book book, Contact contact, DateTime? loanDate = null)
{
if(!Books.Contains(book))
if (!Books.Contains(book))
return Task.FromResult(false);
if(!Contacts.Contains(contact))
if (!Contacts.Contains(contact))
AddContact(contact);
Loan loan = new Loan { Book = book, Loaner = contact, LoanedAt = loanDate.GetValueOrDefault(DateTime.Now) };
if(Loans.Contains(loan))
Loan loan = new Loan
{
Book = book,
Loaner = contact,
LoanedAt = loanDate.GetValueOrDefault(DateTime.Now)
};
if (Loans.Contains(loan))
return Task.FromResult(false);
loans.Add(loan);
return Task.FromResult(true);
@ -228,10 +278,10 @@ namespace StubLib
public Task<bool> GetBackBook(Book book, DateTime? returnedDate = null)
{
if(!Books.Contains(book))
if (!Books.Contains(book))
return Task.FromResult(false);
var loan = loans.SingleOrDefault(l => l.Book == book);
if(loan == null)
if (loan == null)
return Task.FromResult(false);
loan.ReturnedAt = returnedDate.GetValueOrDefault(DateTime.Now);
return Task.FromResult(true);
@ -239,12 +289,17 @@ namespace StubLib
public Task<bool> BorrowBook(Book book, Contact owner, DateTime? borrowedDate = null)
{
if(!Books.Contains(book))
if (!Books.Contains(book))
return Task.FromResult(false);
if(!Contacts.Contains(owner))
if (!Contacts.Contains(owner))
AddContact(owner);
Borrowing borrow = new Borrowing { Book = book, Owner = owner, BorrowedAt = borrowedDate.GetValueOrDefault(DateTime.Now) };
if(Borrowings.Contains(borrow))
Borrowing borrow = new Borrowing
{
Book = book,
Owner = owner,
BorrowedAt = borrowedDate.GetValueOrDefault(DateTime.Now)
};
if (Borrowings.Contains(borrow))
return Task.FromResult(false);
borrowings.Add(borrow);
return Task.FromResult(true);
@ -252,10 +307,10 @@ namespace StubLib
public Task<bool> GiveBackBook(Book book, DateTime? returnedDate = null)
{
if(!Books.Contains(book))
if (!Books.Contains(book))
return Task.FromResult(false);
var borrow = borrowings.SingleOrDefault(b => b.Book == book);
if(borrow == null)
if (borrow == null)
return Task.FromResult(false);
borrow.ReturnedAt = returnedDate.GetValueOrDefault(DateTime.Now);
return Task.FromResult(true);
@ -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,9 +380,14 @@ 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)
switch (sort)
{
case "name":
authors = authors.OrderBy(a => a.Name);
@ -316,19 +396,31 @@ 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);
}
public Task<Book> UpdateBook(Book updatedBook)
{
if(!books.Contains(updatedBook))
if (!books.Contains(updatedBook))
{
return Task.FromResult<Book>(null);
}
@ -337,9 +429,14 @@ 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)
switch (sort)
{
case "title":
books = books.OrderBy(b => b.Title);
@ -353,29 +450,34 @@ 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)
{
IEnumerable<Author> authors = new List<Author>();
if(book.Authors != null && book.Authors.Count > 0)
if (book.Authors != null && book.Authors.Count > 0)
{
authors = authors.Union(book.Authors);
}
if(book.Works != null)
if (book.Works != null)
{
var worksAuthors = book.Works.SelectMany(w => w.Authors).ToList();
if(worksAuthors.Count > 0)
if (worksAuthors.Count > 0)
authors = authors.Union(worksAuthors);
}
foreach(var author in authors)
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))
);
}
}
}

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

@ -18,7 +18,7 @@ WriteLine();
WriteLine("Test Manager.GetBooksByAuthor");
var booksFromHerbert = await manager.GetBooksByAuthor("herbert", 0, 10);
foreach(var b in booksFromHerbert.books)
foreach (var b in booksFromHerbert.books)
{
WriteLine($"\t{b.Title}");
}
@ -27,7 +27,7 @@ WriteLine();
WriteLine("Test Manager.GetBooks");
var books = await manager.GetBooksByTitle("", 0, 100);
foreach(var b in books.books)
foreach (var b in books.books)
{
WriteLine($"\t{b.Title}");
}
@ -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 !";
@ -45,7 +46,7 @@ manager.UpdateBook(book1);
manager.AddBookToCollection("/books/OL26210208M");
manager.AddBookToCollection("/books/OL27258011M");
var mybooks = await manager.GetBooksFromCollection(0, 100);
foreach(var b in mybooks.books)
foreach (var b in mybooks.books)
{
WriteLine($"\t{b.Title} {b.UserRating ?? -1}");
}
@ -54,7 +55,7 @@ WriteLine();
WriteLine("Test Manager.GetContacts");
var contacts = await manager.GetContacts(0, 100);
foreach(var c in contacts.contacts)
foreach (var c in contacts.contacts)
{
WriteLine($"\t{c.FirstName} {c.LastName}");
}
@ -63,38 +64,46 @@ WriteLine();
WriteLine("Test Manager.GetCurrentLoans");
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();
WriteLine("Test Manager.GetPastLoans");
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();
WriteLine("Test Manager.GetCurrentBorrowings");
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();
WriteLine("Test Manager.GetPastBorrowings");
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();
ReadLine();
ReadLine();

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

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

@ -1,11 +1,12 @@
 using System;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Utils
{
public class Mapper<T, U> where T : class
where U : class
public class Mapper<T, U>
where T : class
where U : class
{
readonly HashSet<Tuple<T, U>> mapper = new HashSet<Tuple<T, U>>();
@ -17,7 +18,7 @@ namespace Utils
public T GetT(U entity)
{
var result = mapper.Where(tuple => ReferenceEquals(tuple.Item2, entity));
if(result.Count() != 1)
if (result.Count() != 1)
{
return null;
}
@ -27,7 +28,7 @@ namespace Utils
public U GetU(T model)
{
var result = mapper.Where(tuple => ReferenceEquals(tuple.Item2, model));
if(result.Count() != 1)
if (result.Count() != 1)
{
return null;
}
@ -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 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 BookViewModel(ILibraryManager data)
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));
try
{
var (totalA, authors) = await data.GetAuthorsByName("", 0, 5);
foreach (Author author in authors)
{
var books = data.GetBooksByAuthor(author.Name, 0, 5).Result.Item2;
var observableBooks = new ObservableCollection<Book>(books);
AuteurGroups.Add(new AuteurGroup(author.Name, observableBooks));
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
public class AuteurGroup : ObservableCollection<Book>
{
public string Name { get; private set; }
public AuteurGroup(string name, ObservableCollection<Book> books): base(books)
public AuteurGroup(string name, ObservableCollection<Book> books)
: base(books)
{
Name = name;
}
}
public void GetBooks()
{
var objet = data.GetBooksByAuthor("", 0, 8);
var ojb = objet.Result.Item2;
/*foreach (Book Book in ojb)
{
AuteurGroups.Add(new AuteurGroup(Book.Authors.Name, auteur.Books));
}
ObservableCollection<Auteur> auteurs = new Stub().CreateStubData();
foreach (Auteur auteur in auteurs)
{
AuteurGroups.Add(new AuteurGroup(auteur.Name, auteur.Books));
}
*/
}
public void GetAuthors()
{
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