Skip to content

Commit 7fbeb07

Browse files
committed
Added publisher search
1 parent 0aa16a5 commit 7fbeb07

File tree

6 files changed

+219
-0
lines changed

6 files changed

+219
-0
lines changed

src/Adapters/Database/MySql/Repositories/Library/BookRepository.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,48 @@ FROM Book
224224
}
225225
}
226226

227+
public async Task<Page<string>> FindPublishers(int libraryId, string query, int pageNumber, int pageSize,
228+
CancellationToken cancellationToken)
229+
{
230+
using (var connection = _connectionProvider.GetLibraryConnection())
231+
{
232+
var parameters = new
233+
{
234+
LibraryId = libraryId,
235+
Query = $"%{query}%",
236+
PageSize = pageSize,
237+
Offset = pageSize * (pageNumber - 1),
238+
};
239+
240+
var sql = @"Select Publisher
241+
From Book
242+
Where LibraryId = @LibraryId
243+
AND Publisher Like @Query
244+
ORDER BY Publisher
245+
LIMIT @PageSize OFFSET @Offset";
246+
247+
var command = new CommandDefinition(sql, parameters, cancellationToken: cancellationToken);
248+
249+
var result = await connection.QueryAsync<string>(command);
250+
251+
var sql2 = @"Select Count(*)
252+
From Book
253+
Where LibraryId = @LibraryId
254+
AND Publisher Like @Query";
255+
256+
var command2 = new CommandDefinition(sql2, parameters, cancellationToken: cancellationToken);
257+
var count = await connection.ExecuteScalarAsync<int>(command2);
258+
259+
return new Page<string>()
260+
{
261+
PageNumber = pageNumber,
262+
PageSize = pageSize,
263+
TotalCount = count,
264+
Data = result.ToList()
265+
};
266+
}
267+
}
268+
227269
public async Task<Page<BookModel>> GetBooks(int libraryId, int pageNumber, int pageSize, int? AccountId, BookFilter filter, BookSortByType sortBy, SortDirection direction, CancellationToken cancellationToken)
228270
{
229271
using (var connection = _connectionProvider.GetLibraryConnection())

src/Adapters/Database/SqlServer/Repositories/Library/BookRepository.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,48 @@ From Book
157157
}
158158
}
159159

160+
public async Task<Page<string>> FindPublishers(int libraryId, string query, int pageNumber, int pageSize, CancellationToken cancellationToken)
161+
{
162+
using (var connection = _connectionProvider.GetLibraryConnection())
163+
{
164+
var parameters = new
165+
{
166+
LibraryId = libraryId,
167+
Query = $"%{query}%",
168+
PageNumber= pageNumber,
169+
PageSize = pageSize,
170+
};
171+
172+
var sql = @"Select Publisher
173+
From Book
174+
Where LibraryId = @LibraryId
175+
AND Publisher Like @Query
176+
ORDER BY Publisher
177+
OFFSET @PageSize * (@PageNumber - 1) ROWS
178+
FETCH NEXT @PageSize ROWS ONLY";
179+
180+
var command = new CommandDefinition(sql, parameters, cancellationToken: cancellationToken);
181+
182+
var result = await connection.QueryAsync<string>(command);
183+
184+
var sql2 = @"Select Count(*)
185+
From Book
186+
Where LibraryId = @LibraryId
187+
AND Publisher Like @Query";
188+
189+
var command2 = new CommandDefinition(sql2, parameters, cancellationToken: cancellationToken);
190+
var count = await connection.ExecuteScalarAsync<int>(command2);
191+
192+
return new Page<string>()
193+
{
194+
PageNumber = pageNumber,
195+
PageSize = pageSize,
196+
TotalCount = count,
197+
Data = result.ToList()
198+
};
199+
}
200+
}
201+
160202
public async Task<Page<BookModel>> GetBooks(int libraryId, int pageNumber, int pageSize, int? AccountId, BookFilter filter, BookSortByType sortBy, SortDirection direction, CancellationToken cancellationToken)
161203
{
162204
using (var connection = _connectionProvider.GetLibraryConnection())

src/Inshapardaz.Api/Controllers/BookController.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Inshapardaz.Domain.Models;
77
using Inshapardaz.Domain.Models.Library;
88
using Inshapardaz.Domain.Ports.Command.Library.Book;
9+
using Inshapardaz.Domain.Ports.Query.Library;
910
using Inshapardaz.Domain.Ports.Query.Library.Book;
1011
using Inshapardaz.Domain.Ports.Query.Library.BookShelf;
1112
using Microsoft.AspNetCore.Mvc;
@@ -332,4 +333,28 @@ public async Task<IActionResult> PublishBook(int libraryId, int bookId, [FromBod
332333

333334
return Ok();
334335
}
336+
337+
[HttpGet("libraries/{libraryId}/publishers", Name = nameof(GetPublishers))]
338+
public async Task<IActionResult> GetPublishers(
339+
int libraryId,
340+
string query,
341+
int pageNumber = 1,
342+
int pageSize = 10,
343+
CancellationToken token = default)
344+
{
345+
var request = new GetPublishersQuery(libraryId, query, pageNumber, pageSize);
346+
var result = await _queryProcessor.ExecuteAsync(request, cancellationToken: token);
347+
348+
return Ok(_bookRenderer.Render(libraryId, new PageRendererArgs<string>
349+
{
350+
Page = result,
351+
RouteArguments = new PagedRouteArgs
352+
{
353+
PageNumber = pageNumber,
354+
PageSize = pageSize,
355+
Query = query
356+
}
357+
}));
358+
}
359+
335360
}

src/Inshapardaz.Api/Converters/BookRenderer.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public interface IRenderBook
1717
BookView Render(BookModel source, int libraryId, BookShelfModel bookShelf = null);
1818

1919
PageView<BookView> Render(PageRendererArgs<BookModel, BookFilter> source, int id, BookShelfModel bookShelf = null);
20+
PageView<string> Render(int libraryId, PageRendererArgs<string> source);
2021
}
2122

2223
public class BookRenderer : IRenderBook
@@ -101,6 +102,72 @@ public PageView<BookView> Render(PageRendererArgs<BookModel, BookFilter> source,
101102
return page;
102103
}
103104

105+
public PageView<string> Render(int libraryId, PageRendererArgs<string> source)
106+
{
107+
Dictionary<string, string> GetQuery()
108+
{
109+
Dictionary<string, string> dictionary = new Dictionary<string, string>();
110+
if (!string.IsNullOrWhiteSpace(source.RouteArguments.Query))
111+
{
112+
dictionary.Add("query", source.RouteArguments.Query);
113+
}
114+
115+
return dictionary;
116+
}
117+
118+
var page = new PageView<string>(source.Page.TotalCount, source.Page.PageSize, source.Page.PageNumber)
119+
{
120+
Data = source.Page.Data
121+
};
122+
123+
var links = new List<LinkView>();
124+
125+
var query = GetQuery();
126+
query.Add("pageNumber", (page.CurrentPageIndex).ToString());
127+
links.Add(_linkRenderer.Render(new Link
128+
{
129+
ActionName = nameof(BookController.GetPublishers),
130+
Method = HttpMethod.Get,
131+
Rel = RelTypes.Self,
132+
Parameters = new { libraryId = libraryId },
133+
QueryString = query
134+
}));
135+
136+
137+
if (page.CurrentPageIndex < page.PageCount)
138+
{
139+
var pageQuery = GetQuery();;
140+
pageQuery.Add("pageNumber", (page.CurrentPageIndex + 1).ToString());
141+
142+
links.Add(_linkRenderer.Render(new Link
143+
{
144+
ActionName = nameof(BookController.GetPublishers),
145+
Method = HttpMethod.Get,
146+
Rel = RelTypes.Next,
147+
Parameters = new { libraryId = libraryId },
148+
QueryString = pageQuery
149+
}));
150+
}
151+
152+
if (page.PageCount > 1 && page.CurrentPageIndex > 1 && page.CurrentPageIndex <= page.PageCount)
153+
{
154+
var pageQuery = GetQuery();
155+
pageQuery.Add("pageNumber", (page.CurrentPageIndex - 1).ToString());
156+
157+
links.Add(_linkRenderer.Render(new Link
158+
{
159+
ActionName = nameof(BookController.GetPublishers),
160+
Method = HttpMethod.Get,
161+
Rel = RelTypes.Previous,
162+
Parameters = new { libraryId = libraryId },
163+
QueryString = pageQuery
164+
}));
165+
}
166+
167+
page.Links = links;
168+
return page;
169+
}
170+
104171
private static Dictionary<string, string> CreateQueryString(PageRendererArgs<BookModel, BookFilter> source, PageView<BookView> page)
105172
{
106173
Dictionary<string, string> queryString = new Dictionary<string, string> {

src/Inshapardaz.Domain/Adapters/Repositories/Library/IBookRepository.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,7 @@ Task<ReadProgressModel> AddRecentBook(int libraryId, int accountId, int bookId,
4949
#region for migration
5050
Task<Page<BookModel>> GetBooks(int libraryId, int pageNumber, int pageSize, CancellationToken cancellationToken);
5151
#endregion
52+
53+
Task<Page<string>> FindPublishers(int libraryId, string query, int pageNumber, int pageSize,
54+
CancellationToken cancellationToken);
5255
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Inshapardaz.Domain.Adapters.Repositories.Library;
2+
using Inshapardaz.Domain.Models;
3+
using Inshapardaz.Domain.Models.Library;
4+
using Paramore.Darker;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
8+
namespace Inshapardaz.Domain.Ports.Query.Library;
9+
10+
public class GetPublishersQuery : LibraryBaseQuery<Page<string>>
11+
{
12+
public GetPublishersQuery(int libraryId, string query, int pageNumber, int pageSize)
13+
: base(libraryId)
14+
{
15+
PageNumber = pageNumber;
16+
PageSize = pageSize;
17+
Query = query;
18+
}
19+
20+
public int PageNumber { get; private set; }
21+
22+
public int PageSize { get; private set; }
23+
24+
public string Query { get; set; }
25+
}
26+
27+
public class GetPublishersQueryHandler : QueryHandlerAsync<GetPublishersQuery, Page<string>>
28+
{
29+
private readonly IBookRepository _bookRepository;
30+
31+
public GetPublishersQueryHandler(IBookRepository bookRepository)
32+
{
33+
_bookRepository = bookRepository;
34+
}
35+
36+
public override async Task<Page<string>> ExecuteAsync(GetPublishersQuery query, CancellationToken cancellationToken = default)
37+
{
38+
return await _bookRepository.FindPublishers(query.LibraryId, query.Query, query.PageNumber, query.PageSize, cancellationToken);
39+
}
40+
}

0 commit comments

Comments
 (0)