diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index acdb4d73..cd800cf9 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -43,7 +43,7 @@ public interface IBotSharpRepository void UpdateConversationStates(string conversationId, List states); void UpdateConversationStatus(string conversationId, string status); Conversation GetConversation(string conversationId); - List GetConversations(ConversationFilter filter); + PagedItems GetConversations(ConversationFilter filter); void UpdateConversationTitle(string conversationId, string title); List GetLastConversations(); #endregion diff --git a/src/Infrastructure/BotSharp.Abstraction/Utilities/Pagination.cs b/src/Infrastructure/BotSharp.Abstraction/Utilities/Pagination.cs index 72e4e884..e2dafa7f 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Utilities/Pagination.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Utilities/Pagination.cs @@ -2,12 +2,12 @@ namespace BotSharp.Abstraction.Utilities; public class Pagination { - public int Page { get; set; } = 0; + public int Page { get; set; } = 1; /// /// Use -1 for all records /// public int Size { get; set; } = 20; - public int Offset => (Page + 1) * Size; + public int Offset => (Page - 1) * Size; } public class PagedItems diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index d6a15072..d471fd9f 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -57,14 +57,8 @@ public partial class ConversationService : IConversationService public async Task> GetConversations(ConversationFilter filter) { var db = _services.GetRequiredService(); - var user = db.GetUserById(_user.Id); var conversations = db.GetConversations(filter); - var result = new PagedItems - { - Count = conversations.Count(), - Items = conversations.OrderByDescending(x => x.CreatedTime) - }; - return result; + return conversations; } public async Task> GetLastConversations() diff --git a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs index 9a395edf..c8b75e7e 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs @@ -136,7 +136,7 @@ public class BotSharpDbContext : Database, IBotSharpRepository throw new NotImplementedException(); } - public List GetConversations(ConversationFilter filter) + public PagedItems GetConversations(ConversationFilter filter) { throw new NotImplementedException(); } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs index da6b9c9d..d9e276e5 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs @@ -200,12 +200,14 @@ namespace BotSharp.Core.Repository return record; } - public List GetConversations(ConversationFilter filter) + public PagedItems GetConversations(ConversationFilter filter) { var records = new List(); var dir = Path.Combine(_dbSettings.FileRepository, _conversationSettings.DataDir); + var totalDirs = Directory.GetDirectories(dir); + var dirs = totalDirs.Skip(filter.Pager.Offset).Take(filter.Pager.Size).ToList(); - foreach (var d in Directory.GetDirectories(dir)) + foreach (var d in dirs) { var path = Path.Combine(d, CONVERSATION_FILE); if (!File.Exists(path)) continue; @@ -225,7 +227,11 @@ namespace BotSharp.Core.Repository records.Add(record); } - return records; + return new PagedItems + { + Items = records.OrderByDescending(x => x.CreatedTime), + Count = totalDirs.Count(), + }; } public List GetLastConversations() diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index 58378ba5..46a1b721 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -30,8 +30,8 @@ public class ConversationController : ControllerBase return ConversationViewModel.FromSession(conv); } - [HttpGet("/conversations")] - public async Task> GetConversations([FromQuery] ConversationFilter filter) + [HttpPost("/conversations")] + public async Task> GetConversations([FromBody] ConversationFilter filter) { var service = _services.GetRequiredService(); var conversations = await service.GetConversations(filter); diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs index 6c8eb222..84ccce6d 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs @@ -204,7 +204,7 @@ public partial class MongoRepository }; } - public List GetConversations(ConversationFilter filter) + public PagedItems GetConversations(ConversationFilter filter) { var conversations = new List(); var builder = Builders.Filter; @@ -215,7 +215,10 @@ public partial class MongoRepository if (!string.IsNullOrEmpty(filter.Channel)) filters.Add(builder.Eq(x => x.Channel, filter.Channel)); if (!string.IsNullOrEmpty(filter.UserId)) filters.Add(builder.Eq(x => x.UserId, filter.UserId)); - var conversationDocs = _dc.Conversations.Find(builder.And(filters)).ToList(); + var filterDef = builder.And(filters); + var sortDefinition = Builders.Sort.Descending(x => x.CreatedTime); + var conversationDocs = _dc.Conversations.Find(filterDef).Sort(sortDefinition).Skip(filter.Pager.Offset).Limit(filter.Pager.Size).ToList(); + var count = _dc.Conversations.CountDocuments(filterDef); foreach (var conv in conversationDocs) { @@ -233,7 +236,11 @@ public partial class MongoRepository }); } - return conversations; + return new PagedItems + { + Items = conversations, + Count = (int)count + }; } public List GetLastConversations()