You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
4.5 KiB

using System.Data.SqlTypes;
using DtoAbstractLayer;
using LibraryDTO;
using Microsoft.EntityFrameworkCore;
using MyLibraryDB;
using MyLibraryEntities;
using StubbedDB;
namespace MyLibraryManager;
public class MyLibraryMgr : IDtoManager
{
protected MyLibraryContext Context => _dbContext;
private readonly MyLibraryContext _dbContext;
public MyLibraryMgr() : this(new MyLibraryStubbedContext())
{
}
public MyLibraryMgr(string dbPlatformPath)
: this(new MyLibraryStubbedContext(dbPlatformPath))
{
Context.Database.EnsureCreated();
}
internal MyLibraryMgr(MyLibraryStubbedContext context)
{
_dbContext = context;
}
public async Task<AuthorDTO> GetAuthorById(string id)
{
var author = await Context.Authors.SingleOrDefaultAsync(a => a.Id.ToUpper().Contains(id.ToUpper()));
return author.ToDto();
}
public async Task<Tuple<long, IEnumerable<AuthorDTO>>> GetAuthorsByName(string substring, int index, int count, string sort = "")
{
var authors = Context.Authors.Where(a => a.Name.ToUpper().Contains(substring.ToUpper()));
switch(sort)
{
case "name":
authors = authors.OrderBy(a => a.Name);
break;
case "name_reverse":
authors = authors.OrderByDescending(a => a.Name);
break;
default:
break;
}
long nb = await authors.CountAsync();
return await Task.FromResult(Tuple.Create(nb, authors.Skip(index*count).Take(count).ToDtos()));
}
public async Task<BookDTO> GetBookById(string id)
{
var book = await Context.Books.SingleOrDefaultAsync(b => b.Id.ToUpper().Contains(id.ToUpper()));
return book.ToDto();
}
public async Task<BookDTO> GetBookByISBN(string isbn)
{
var book = await Context.Books.SingleOrDefaultAsync(b => b.ISBN13 == isbn);
return book?.ToDto();
}
Func<AuthorEntity, string, bool> predicateAuthorName =(a, s) => a.Name.ToUpper().Contains(s.ToUpper());
//|| a.AlternateNames.Count(an => an.ToUpper().Contains(s.ToUpper())) > 0;
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthor(string author, int index, int count, string sort = "")
{
var books2 = Context.Books.SelectMany(b => b.Authors, (b, a) => new {Book = b, AuthorName = a.Name });
var books3 = books2.Where(ba => ba.AuthorName.ToUpper().Contains(author.ToUpper()));
var books4 = books3.Select(ba => ba.Book).Distinct();
// var books = Context.Books.Where(b => b.Authors.Where(a => a.Name.ToUpper().Contains(author.ToUpper())).Count() > 0);// Exists(a => predicateAuthorName(a, author)));
return await SortAndFilterBooks(books4, index, count, sort);
}
private async Task<Tuple<long, IEnumerable<BookDTO>>> SortAndFilterBooks(IQueryable<BookEntity>? books, int index, int count, string sort = "")
{
switch(sort)
{
case "title":
books = books.OrderBy(a => a.Title);
break;
case "title_reverse":
books = books.OrderByDescending(a => a.Title);
break;
case "new":
books = books.OrderByDescending(a => a.PublishDate);
break;
case "old":
books = books.OrderBy(a => a.PublishDate);
break;
default:
break;
}
long nb = await books.CountAsync();
return await Task.FromResult(Tuple.Create(nb, books.Skip(index*count).Take(count).ToDtos()));
}
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByAuthorId(string authorId, int index, int count, string sort = "")
{
//var books = Context.Books.Where(b => b.Authors.Count(a => a.Id == authorId) > 0);
var books2 = Context.Books.SelectMany(b => b.Authors, (b, a) => new {Book = b, AuthorId = a.Id });
var books3 = books2.Where(ba => ba.AuthorId.ToUpper().Contains(authorId.ToUpper()));
var books4 = books3.Select(ba => ba.Book).Distinct();
return await SortAndFilterBooks(books4, index, count, sort);
}
public async Task<Tuple<long, IEnumerable<BookDTO>>> GetBooksByTitle(string title, int index, int count, string sort = "")
{
var books = Context.Books.Where(b => b.Title.ToUpper().Contains(title.ToUpper()));
return await SortAndFilterBooks(books, index, count, sort);
}
}