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.
63 lines
2.5 KiB
63 lines
2.5 KiB
using BukiVedi.Shared.Entities;
|
|
using BukiVedi.Shared.Models;
|
|
using BukiVedi.Shared.Services;
|
|
using BukiVedi.Shared.Services.Mappers;
|
|
|
|
namespace BukiVedi.Shared.Apps
|
|
{
|
|
public class AuthorHandler
|
|
: IAuthorHandler
|
|
{
|
|
private readonly ILibrary _library;
|
|
public AuthorHandler(ILibrary library)
|
|
{
|
|
if (library == null) throw new ArgumentNullException(nameof(library));
|
|
_library = library;
|
|
}
|
|
|
|
public async Task AddToFavorite(string id, OperationContext context)
|
|
{
|
|
if (await Tables.FavoriteAuthors.Exists(Filters.FavoriteAuthors.Exact(id, context.OperationInitiator.Id)) == false)
|
|
{
|
|
await Tables.FavoriteAuthors.Write(new FavoriteAuthor { AuthorId = id, UserId = context.OperationInitiator.Id });
|
|
}
|
|
}
|
|
|
|
public async Task<IEnumerable<AuthorInfo>> GetAllAuthors(OperationContext context) =>
|
|
(await Tables.Authors.GetAll()).Select(a => new AuthorInfo { Id = a.Id, Name = a.Name })?.ToArray()!;
|
|
|
|
public async Task<IEnumerable<AuthorInfo>> GetFavoriteAuthors(OperationContext context)
|
|
{
|
|
var authorIds = (await Tables.FavoriteAuthors.Get(Filters.FavoriteAuthors.ByUser(context.OperationInitiator.Id)))?.Select(f => f.AuthorId)?.ToHashSet()!;
|
|
if (authorIds != null && authorIds.Any())
|
|
{
|
|
var authors = (await Tables.Authors.Get(Filters.Authors.ByIds(authorIds)))?.Select(a => new AuthorInfo { Id = a.Id, Name = a.Name })?.ToArray()!;
|
|
return authors;
|
|
}
|
|
return Enumerable.Empty<AuthorInfo>();
|
|
}
|
|
|
|
public async Task RemoveFromFavorite(string id, OperationContext context)
|
|
{
|
|
var records = (await Tables.FavoriteAuthors.Get(Filters.FavoriteAuthors.Exact(id, context.OperationInitiator.Id)))?.ToHashSet()!;
|
|
if (records != null && records.Count > 0)
|
|
{
|
|
foreach (var record in records)
|
|
{
|
|
await Tables.FavoriteAuthors.TryRemoveById(record.Id);
|
|
}
|
|
}
|
|
}
|
|
|
|
public async Task<IEnumerable<BookInfo>> SearchByAuthor(string id, OperationContext context)
|
|
{
|
|
var books = (await _library.SearchBooksByAuthor(id))?.ToArray()!;
|
|
if (books != null && books.Any())
|
|
{
|
|
return await BookEntityMapper.Map(books, context);
|
|
}
|
|
return Enumerable.Empty<BookInfo>();
|
|
}
|
|
}
|
|
}
|