feat: Implement Public Message management features including create, update, delete, and publish functionalities

This commit is contained in:
masoodafar-web
2025-12-04 17:29:05 +03:30
parent 64b6f34185
commit 82319285bc
19 changed files with 550 additions and 98 deletions

View File

@@ -1,17 +1,54 @@
// GetActiveMessages - Public view
using BackOffice.BFF.Application.Common.Interfaces;
using BackOffice.BFF.PublicMessage.Protobuf;
using CMSMicroservice.Protobuf.Protos;
using Google.Protobuf.WellKnownTypes;
using MediatR;
namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetActiveMessages;
public record GetActiveMessagesQuery : IRequest<object> // TODO: define response
public record GetActiveMessagesQuery : IRequest<GetActiveMessagesResponse>
{
public int? MessageType { get; init; }
public string? TargetAudience { get; init; }
}
public class GetActiveMessagesQueryHandler : IRequestHandler<GetActiveMessagesQuery, object>
public class GetActiveMessagesQueryHandler : IRequestHandler<GetActiveMessagesQuery, GetActiveMessagesResponse>
{
public async Task<object> Handle(GetActiveMessagesQuery request, CancellationToken cancellationToken)
private readonly IApplicationContractContext _context;
public GetActiveMessagesQueryHandler(IApplicationContractContext context)
{
// TODO: gRPC call to CMS PublicMessageContract.GetActiveMessages
throw new NotImplementedException();
_context = context;
}
public async Task<GetActiveMessagesResponse> Handle(GetActiveMessagesQuery request, CancellationToken cancellationToken)
{
var cmsRequest = new GetActiveMessagesRequest();
// نسخه فعلی CMS فیلدی برای فیلتر ندارد؛ در صورت اضافه شدن، اینجا مپ می‌شود.
var cmsResponse = await _context.PublicMessages.GetActiveMessagesAsync(cmsRequest, cancellationToken: cancellationToken);
var result = new GetActiveMessagesResponse();
foreach (var message in cmsResponse.Messages)
{
result.Messages.Add(new PublicMessageDto
{
MessageId = message.Id,
Title = message.Title,
Content = message.Content,
MessageType = message.Type,
MessageTypeName = message.TypeName,
Priority = message.Priority,
PriorityName = message.PriorityName,
StartsAt = message.StartsAt,
ExpiresAt = message.ExpiresAt,
IsDismissible = false,
Tags = { }
});
}
return result;
}
}

View File

@@ -1,19 +1,80 @@
// GetAllMessages - Admin view
using BackOffice.BFF.Application.Common.Interfaces;
using BackOffice.BFF.PublicMessage.Protobuf;
using CMSMicroservice.Protobuf.Protos;
using Google.Protobuf.WellKnownTypes;
using MediatR;
namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetAllMessages;
public record GetAllMessagesQuery : IRequest<object> // TODO: define response
public record GetAllMessagesQuery : IRequest<GetAllMessagesResponse>
{
public int? Status { get; init; }
public int? MessageType { get; init; }
public int PageNumber { get; init; }
public int PageSize { get; init; }
}
public class GetAllMessagesQueryHandler : IRequestHandler<GetAllMessagesQuery, object>
public class GetAllMessagesQueryHandler : IRequestHandler<GetAllMessagesQuery, GetAllMessagesResponse>
{
public async Task<object> Handle(GetAllMessagesQuery request, CancellationToken cancellationToken)
private readonly IApplicationContractContext _context;
public GetAllMessagesQueryHandler(IApplicationContractContext context)
{
// TODO: gRPC call to CMS PublicMessageContract.GetAllMessages
throw new NotImplementedException();
_context = context;
}
public async Task<GetAllMessagesResponse> Handle(GetAllMessagesQuery request, CancellationToken cancellationToken)
{
var cmsRequest = new GetAllMessagesRequest
{
PageNumber = request.PageNumber,
PageSize = request.PageSize
};
if (request.Status.HasValue)
{
cmsRequest.IsActive = new BoolValue { Value = request.Status.Value == 1 };
}
if (request.MessageType.HasValue)
{
cmsRequest.Type = new Int32Value { Value = request.MessageType.Value };
}
var cmsResponse = await _context.PublicMessages.GetAllMessagesAsync(cmsRequest, cancellationToken: cancellationToken);
var result = new GetAllMessagesResponse
{
TotalCount = (int)cmsResponse.MetaData.TotalCount,
PageNumber = request.PageNumber,
PageSize = request.PageSize
};
foreach (var message in cmsResponse.Messages)
{
result.Messages.Add(new AdminPublicMessageDto
{
MessageId = message.Id,
Title = message.Title,
Content = message.Content,
MessageType = message.Type,
MessageTypeName = message.TypeName,
Priority = message.Priority,
PriorityName = message.PriorityName,
Status = message.IsActive ? 1 : 0,
StatusName = message.IsActive ? "Active" : (message.IsExpired ? "Expired" : "Inactive"),
StartsAt = message.StartsAt,
ExpiresAt = message.ExpiresAt,
PublishedAt = null,
ArchivedAt = null,
IsDismissible = false,
TargetAudience = string.Empty,
Created = message.Created,
LastModified = message.LastModified
});
}
return result;
}
}