Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions Rnwood.Smtp4dev.Tests/Controllers/MessagesControllerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@
using MimeKit.Encodings;
using NSubstitute;
using Rnwood.Smtp4dev.Data;
using Rnwood.Smtp4dev.DbModel;
using Rnwood.Smtp4dev.Hubs;
using Rnwood.Smtp4dev.Tests.DBMigrations.Helpers;
using Xunit;
using Rnwood.Smtp4dev.Server.Settings;
using Microsoft.Extensions.Options;

namespace Rnwood.Smtp4dev.Tests.Controllers
{
Expand Down Expand Up @@ -101,6 +103,7 @@ public async Task GetMessage_ValidMime()
IMessage message = await memoryMessageBuilder.ToMessage();

var dbMessage = await new MessageConverter().ConvertAsync(message, ["to@envelope.com"]);
dbMessage.Folder = new Folder { Name = "INBOX", Path = "INBOX" };
return dbMessage;
}

Expand Down Expand Up @@ -130,6 +133,7 @@ public async Task GetMessage_ValidMime()

var dbMessage = await new MessageConverter().ConvertAsync(message, [to]);
dbMessage.Mailbox = new DbModel.Mailbox { Name = MailboxOptions.DEFAULTNAME };
dbMessage.Folder = new DbModel.Folder { Name = "INBOX", Path = "INBOX", Mailbox = dbMessage.Mailbox };

return dbMessage;
}
Expand Down Expand Up @@ -185,9 +189,10 @@ public async Task GetSummaries_Search_MatchingMessagesReturned()
var sqlLiteForTesting = new SqliteInMemory();
var context = new Smtp4devDbContext(sqlLiteForTesting.ContextOptions);
MessagesRepository messagesRepository =
new MessagesRepository(Substitute.For<ITaskQueue>(), Substitute.For<NotificationsHub>(), context);
messagesRepository.DbContext.Messages.AddRange(testMessage1, testMessage2, testMessage3);
await messagesRepository.DbContext.SaveChangesAsync();
new MessagesRepository(Substitute.For<ITaskQueue>(), Substitute.For<NotificationsHub>(), context, Options.Create( new Smtp4dev.Server.Settings.ServerOptions()));
await messagesRepository.AddMessage(testMessage1);
await messagesRepository.AddMessage(testMessage2);
await messagesRepository.AddMessage(testMessage3);
MessagesController messagesController = new MessagesController(messagesRepository, null);

var result = messagesController.GetSummaries("sUbJect2");
Expand Down
2 changes: 1 addition & 1 deletion Rnwood.Smtp4dev.Tests/Controllers/RelayMessageTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public RelayMessagesTests()
var sqlLiteForTesting = new SqliteInMemory();
context = new Smtp4devDbContext(sqlLiteForTesting.ContextOptions);
InitRepo();
messagesRepository.GetMessages(Arg.Any<string>(), Arg.Any<bool>())
messagesRepository.GetMessages(Arg.Any<string>(), null, Arg.Any<bool>())
.Returns(context.Messages);
messagesRepository.TryGetMessageById(Arg.Any<Guid>(), Arg.Any<bool>())

Expand Down
19 changes: 14 additions & 5 deletions Rnwood.Smtp4dev.Tests/TestMessagesRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,28 @@ public Task DeleteAllMessages(string mailboxName)
}

public Smtp4devDbContext DbContext => throw new NotImplementedException();

public Task DeleteMessage(Guid id)
public Task CopyMessageToFolder(Guid id, string targetFolder)
{
Messages.RemoveAll(m => m.Id == id);
var message = Messages.FirstOrDefault(m => m.Id == id);
if (message != null)
{
message.Folder = new Folder() { Name = targetFolder, Path = targetFolder };
}
return Task.CompletedTask;
}

public IQueryable<Message> GetAllMessages(bool unTracked = true)
public IQueryable<Message> GetMessages(string mailboxName, string folder = null, bool unTracked = true)
{
return Messages.AsQueryable();
}

public IQueryable<Message> GetMessages(string mailboxName, bool unTracked = true)
public Task DeleteMessage(Guid id)
{
Messages.RemoveAll(m => m.Id == id);
return Task.CompletedTask;
}

public IQueryable<Message> GetAllMessages(bool unTracked = true)
{
return Messages.AsQueryable();
}
Expand Down
4 changes: 4 additions & 0 deletions Rnwood.Smtp4dev/ApiModel/MessageSummary.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Rnwood.Smtp4dev.Migrations;
using System;
using System.Text.Json.Serialization;
using Rnwood.Smtp4dev.DbModel;

namespace Rnwood.Smtp4dev.ApiModel
{
Expand All @@ -17,6 +18,7 @@ public MessageSummary(DbModel.Message dbMessage)
IsUnread = dbMessage.IsUnread;
IsRelayed = dbMessage.Relays.Count > 0;
DeliveredTo = dbMessage.DeliveredTo;
Folder = dbMessage.Folder?.Name;
}

public bool IsRelayed { get; set; }
Expand All @@ -28,6 +30,8 @@ public MessageSummary(DbModel.Message dbMessage)
public DateTime ReceivedDate { get; set; }

public string Subject { get; set; }

public string Folder { get; set; }

public int AttachmentCount { get; set; }

Expand Down
9 changes: 6 additions & 3 deletions Rnwood.Smtp4dev/ClientApp/src/ApiClient/MessageSummary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@
constructor(
id: string,
from: string,
to: string[],
to: string[],
deliveredTo: string[],
receivedDate: Date,
subject: string,
attachmentCount: number,
isUnread: boolean,
isRelayed: boolean,
folder: string,
) {
this.id = id;
this.from = from;
this.to = to;
this.deliveredTo = to;
this.to = to;
this.folder = folder;
this.deliveredTo = to;
this.receivedDate = receivedDate;
this.subject = subject;
this.attachmentCount = attachmentCount;
Expand All @@ -24,6 +26,7 @@

id: string;
from: string;
folder: string;
to: string[];
receivedDate: Date;
subject: string;
Expand Down
3 changes: 3 additions & 0 deletions Rnwood.Smtp4dev/ClientApp/src/components/messagelist.vue
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@
width="160"
sortable="custom"
:formatter="formatDate"></el-table-column>
<el-table-column property="folder"
label="Folder"
width="140"></el-table-column>
<el-table-column property="from"
label="From"
width="140"
Expand Down
9 changes: 6 additions & 3 deletions Rnwood.Smtp4dev/Controllers/MessagesController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ public MessagesController(IMessagesRepository messagesRepository, ISmtp4devServe
[SwaggerResponse(System.Net.HttpStatusCode.OK, typeof(MessageSummary[]), Description = "")]
public MessageSummary[] GetNewSummaries(Guid? lastSeenMessageId, string mailboxName = MailboxOptions.DEFAULTNAME, int pageSize = 50)
{
return messagesRepository.GetMessages(mailboxName, true)
return messagesRepository.GetMessages(mailboxName, null, true)
.Include(m => m.Relays)
.Include(m => m.Folder)
.OrderByDescending(m => m.ReceivedDate)
.ThenByDescending(m => m.Id)
.AsEnumerable()
Expand All @@ -71,8 +73,9 @@ public ApiModel.PagedResult<MessageSummary> GetSummaries(string searchTerms, str
bool sortIsDescending = true, int page = 1,
int pageSize = 5)
{
IEnumerable<DbModel.Message> query = messagesRepository.GetMessages(mailboxName, true)
IEnumerable<DbModel.Message> query = messagesRepository.GetMessages(mailboxName, null, true)
.Include(m => m.Relays)
.Include(m => m.Folder)
.OrderBy(sortColumn + (sortIsDescending ? " DESC" : ""));

if (!string.IsNullOrEmpty(searchTerms))
Expand Down Expand Up @@ -257,7 +260,7 @@ public async Task<IActionResult> RelayMessage(Guid id, [FromBody] MessageRelayOp
message.AddRelay(new MessageRelay { SendDate = relay.RelayDate, To = relay.Email });
}

messagesRepository.DbContext.SaveChanges();
await messagesRepository.UpdateMessage(message);
}

return Ok();
Expand Down
77 changes: 77 additions & 0 deletions Rnwood.Smtp4dev/Data/FolderRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Rnwood.Smtp4dev.DbModel;
using Rnwood.Smtp4dev.Hubs;
using Rnwood.Smtp4dev.Server;

namespace Rnwood.Smtp4dev.Data
{
public class FolderRepository : IFolderRepository
{
private readonly ITaskQueue taskQueue;
private readonly NotificationsHub notificationsHub;
private readonly Smtp4devDbContext dbContext;

public FolderRepository(ITaskQueue taskQueue, NotificationsHub notificationsHub, Smtp4devDbContext dbContext)
{
this.taskQueue = taskQueue;
this.notificationsHub = notificationsHub;
this.dbContext = dbContext;
}

public Task CreateFolder(string name, Mailbox mailbox)
{
return taskQueue.QueueTask(() =>
{
dbContext.Folders.Add(new Folder()
{
Name = name,
Path = name,
Mailbox = mailbox,
Id = Guid.NewGuid(),
});
dbContext.SaveChanges();
}, true);
}

public IQueryable<Folder> GetAllFolders(Mailbox mailbox)
{
return dbContext.Folders.Where(f => f.Mailbox == mailbox);
}

public Task DeleteFolder(string folderName, Mailbox mailbox)
{
foreach(var folder in dbContext.Folders.Where(f => f.Path == folderName))
{
dbContext.Remove(folder);
}

dbContext.SaveChanges();

return Task.CompletedTask;
}

public Smtp4devDbContext DbContext => this.dbContext;
public Folder GetFolderOrCreate(string folderName, Mailbox mailbox)
{
var folder = dbContext.Folders.Include(m => m.Mailbox).FirstOrDefault(m => m.Path == folderName);
if (folder == null)
{
folder = new Folder()
{
Name = folderName,
Path = folderName,
Mailbox = mailbox,
Id = Guid.NewGuid(),
};

dbContext.Folders.Add(folder);
dbContext.SaveChanges();
}

return folder;
}
}
}
19 changes: 19 additions & 0 deletions Rnwood.Smtp4dev/Data/IFolderRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System.Linq;
using System.Threading.Tasks;
using Rnwood.Smtp4dev.DbModel;

namespace Rnwood.Smtp4dev.Data
{
public interface IFolderRepository
{
Task CreateFolder(string name, Mailbox mailbox);

Task DeleteFolder(string folderName, Mailbox mailbox);


IQueryable<DbModel.Folder> GetAllFolders(Mailbox mailbox);

Smtp4devDbContext DbContext { get; }
Folder GetFolderOrCreate(string folderName, Mailbox mailbox);
}
}
15 changes: 15 additions & 0 deletions Rnwood.Smtp4dev/Data/IMailboxRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Linq;
using System.Threading.Tasks;
using Rnwood.Smtp4dev.DbModel;

namespace Rnwood.Smtp4dev.Data
{
public interface IMailboxRepository
{
IQueryable<DbModel.Mailbox> GetAllMailboxes();

Mailbox GetMailboxByName(string name);

Smtp4devDbContext DbContext { get; }
}
}
11 changes: 8 additions & 3 deletions Rnwood.Smtp4dev/Data/IMessagesRepository.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using Rnwood.Smtp4dev.DbModel;
using System;
using System.Linq;
using System.Threading.Tasks;

Expand All @@ -11,14 +12,18 @@ public interface IMessagesRepository

IQueryable<DbModel.Message> GetAllMessages(bool unTracked = true);

IQueryable<DbModel.Message> GetMessages(string mailboxName, bool unTracked = true);
IQueryable<DbModel.Message> GetMessages(string mailboxName, string folder = null, bool unTracked = true);

Task AddMessage(DbModel.Message message);

Task DeleteMessage(Guid id);

Task DeleteAllMessages(string mailbox);

Task<DbModel.Message> TryGetMessageById(Guid id, bool tracked);

Smtp4devDbContext DbContext { get; }
Task CopyMessageToFolder(Guid id, string targetFolder);
Task TrimMessages();
Task UpdateMessage(Message message);
}
}
40 changes: 40 additions & 0 deletions Rnwood.Smtp4dev/Data/MailboxRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Rnwood.Smtp4dev.DbModel;
using Rnwood.Smtp4dev.Hubs;
using Rnwood.Smtp4dev.Server;

namespace Rnwood.Smtp4dev.Data
{
public class MailboxRepository : IMailboxRepository
{
private readonly ITaskQueue taskQueue;
private readonly NotificationsHub notificationsHub;
private readonly Smtp4devDbContext dbContext;

public MailboxRepository(ITaskQueue taskQueue, NotificationsHub notificationsHub, Smtp4devDbContext dbContext)
{
this.taskQueue = taskQueue;
this.notificationsHub = notificationsHub;
this.dbContext = dbContext;
}

public IQueryable<Mailbox> GetAllMailboxes()
{
var query = dbContext.Mailboxes;
return query;
}

public Mailbox GetMailboxByName(string name)
{
return dbContext.Mailboxes.FirstOrDefault(m => m.Name == name);
}

public Smtp4devDbContext DbContext => this.dbContext;



}
}
Loading
Loading