mirror of
https://github.com/Govor-team/Govor.git
synced 2026-09-22 18:43:00 +00:00
Stable server
was added removing messages many fixes bugs and moving to result pattern from throwing exceptions
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
using Govor.Application.Messages.Parameters;
|
||||
using Govor.Domain.Common;
|
||||
using Govor.Domain.Models.Messages;
|
||||
using SmartRes;
|
||||
|
||||
namespace Govor.Application.Messages;
|
||||
|
||||
public interface IMessageRemovingService
|
||||
{
|
||||
Task<DeleteMessageResult> DeleteMessageAsync(DeleteMessage deleteParams);
|
||||
Task<Result<Message,Error>> DeleteMessageAsync(DeleteMessage deleteParams);
|
||||
}
|
||||
@@ -1,9 +1,11 @@
|
||||
using Govor.Domain.Common;
|
||||
using Govor.Domain.Models.Messages;
|
||||
using SmartRes;
|
||||
|
||||
namespace Govor.Application.Messages;
|
||||
|
||||
public interface IMessagesLoader
|
||||
{
|
||||
Task<List<Message>> LoadMessagesInUserChat(Guid privateChatId,Guid currentId, Guid? startMessageId, int before = 20, int after = 2);
|
||||
Task<List<Message>> LoadMessagesInChatGroup(Guid chatId,Guid currentId, Guid? startMessageId, int before = 20, int after = 2);
|
||||
Task<Result<List<Message>,Error>> LoadMessagesInUserChat(Guid privateChatId,Guid currentId, Guid? startMessageId, int before = 20, int after = 2);
|
||||
Task<Result<List<Message>,Error>> LoadMessagesInChatGroup(Guid chatId,Guid currentId, Guid? startMessageId, int before = 20, int after = 2);
|
||||
}
|
||||
@@ -1,6 +1,10 @@
|
||||
using Govor.Application.Messages.Parameters;
|
||||
using Govor.Domain;
|
||||
using Govor.Domain.Common;
|
||||
using Govor.Domain.Models.Messages;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using SmartRes;
|
||||
|
||||
namespace Govor.Application.Messages;
|
||||
|
||||
@@ -17,8 +21,67 @@ public class MessageRemovingService : IMessageRemovingService
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public Task<DeleteMessageResult> DeleteMessageAsync(DeleteMessage deleteParams)
|
||||
public async Task<Result<Message,Error>> DeleteMessageAsync(DeleteMessage deleteParams)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
var message = await _govorDbContext.Messages.FirstOrDefaultAsync(m => m.Id == deleteParams.MessageId);
|
||||
|
||||
if (message == null)
|
||||
return Result<Message, Error>.Failure(
|
||||
Error.NotFound(
|
||||
"MessageRemoving",
|
||||
"Message with given id doesn't exist")
|
||||
);
|
||||
|
||||
var result = message.RecipientType switch
|
||||
{
|
||||
RecipientType.Group => await ValidateGroupRecipientAsync(message, deleteParams),
|
||||
RecipientType.User => await ValidateUserRecipientAsync(message, deleteParams),
|
||||
|
||||
_ => Result<Message, Error>.Failure(Error.Failure(
|
||||
"MessageRemoving.ArgumentOutOfRangeException",
|
||||
$"Argument out of range: {nameof(message.RecipientType)}"
|
||||
)
|
||||
)
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<Result<Message,Error>> ValidateGroupRecipientAsync(Message message, DeleteMessage deleteParams)
|
||||
{
|
||||
if (deleteParams.DeleterId == message.RecipientId)
|
||||
{
|
||||
return await ForceRemoveAsync(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO made admin rules
|
||||
return Result<Message, Error>.Failure(Error.Failure("MessageRemoving.HaveNoPermission",
|
||||
$"You do not have permission to delete message {message.Id}"
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<Result<Message,Error>> ValidateUserRecipientAsync(Message message, DeleteMessage deleteParams)
|
||||
{
|
||||
if (deleteParams.DeleterId == message.RecipientId)
|
||||
{
|
||||
return await ForceRemoveAsync(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO made hide rules
|
||||
return Result<Message, Error>.Failure(Error.Failure("MessageRemoving.HaveNoPermission",
|
||||
$"You do not have permission to delete message {message.Id}"
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<Result<Message, Error>> ForceRemoveAsync(Message message)
|
||||
{
|
||||
_govorDbContext.Messages.Remove(message);
|
||||
await _govorDbContext.SaveChangesAsync();
|
||||
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
using Govor.Application.Interfaces;
|
||||
using Govor.Domain.Models.Messages;
|
||||
using Govor.Domain;
|
||||
using Govor.Domain.Common;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using SmartRes;
|
||||
|
||||
namespace Govor.Application.Messages;
|
||||
|
||||
@@ -14,7 +16,7 @@ public class MessagesLoader : IMessagesLoader
|
||||
_dbContext = dbContext;
|
||||
}
|
||||
|
||||
public async Task<List<Message>> LoadMessagesInUserChat(
|
||||
public async Task<Result<List<Message>,Error>> LoadMessagesInUserChat(
|
||||
Guid privateChatId,
|
||||
Guid currentUser,
|
||||
Guid? startMessageId,
|
||||
@@ -22,11 +24,11 @@ public class MessagesLoader : IMessagesLoader
|
||||
int after = 2)
|
||||
{
|
||||
if (privateChatId == Guid.Empty)
|
||||
throw new ArgumentException("PrivateChatId id cannot be empty", nameof(privateChatId));
|
||||
return Result.Failure<List<Message>>(Error.Failure(nameof(ArgumentException),"PrivateChatId id cannot be empty."));
|
||||
|
||||
var chatExists = await _dbContext.PrivateChats.AnyAsync(c => c.Id == privateChatId);
|
||||
if (!chatExists)
|
||||
return [];
|
||||
return new List<Message>(0);
|
||||
|
||||
var query = _dbContext.Messages
|
||||
.AsNoTracking()
|
||||
@@ -37,7 +39,7 @@ public class MessagesLoader : IMessagesLoader
|
||||
return await FetchPaginatedMessagesAsync(query, startMessageId, before, after);
|
||||
}
|
||||
|
||||
public async Task<List<Message>> LoadMessagesInChatGroup(
|
||||
public async Task<Result<List<Message>,Error>> LoadMessagesInChatGroup(
|
||||
Guid chatId,
|
||||
Guid currentUser,
|
||||
Guid? startMessageId,
|
||||
@@ -45,13 +47,13 @@ public class MessagesLoader : IMessagesLoader
|
||||
int after = 2)
|
||||
{
|
||||
if (chatId == Guid.Empty)
|
||||
throw new ArgumentException("Chat id cannot be empty", nameof(chatId));
|
||||
return Result.Failure<List<Message>>(Error.Failure(nameof(ArgumentException),"Chat id cannot be empty."));
|
||||
|
||||
var isMember = await _dbContext.GroupMemberships
|
||||
.AnyAsync(gm => gm.UserId == currentUser && gm.GroupId == chatId);
|
||||
|
||||
if (!isMember)
|
||||
return [];
|
||||
return new List<Message>(0);
|
||||
|
||||
var query = _dbContext.Messages
|
||||
.AsNoTracking()
|
||||
|
||||
@@ -2,4 +2,5 @@ namespace Govor.Application.Messages.Parameters;
|
||||
|
||||
public record DeleteMessage(
|
||||
Guid DeleterId,
|
||||
Guid MessageId);
|
||||
Guid MessageId,
|
||||
bool ForceRemove = false);
|
||||
|
||||
Reference in New Issue
Block a user