Add calendar integrations and collaboration updates
Some checks failed
Backend CI/CD / build_and_deploy (push) Has been cancelled
Frontend CI/CD / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-05-05 15:25:53 -04:00
parent c49f03ec06
commit b66c10b681
82 changed files with 8420 additions and 2048 deletions

View File

@@ -2,8 +2,10 @@ using FastEndpoints;
using Microsoft.EntityFrameworkCore;
using Socialize.Api.Data;
using Socialize.Api.Infrastructure.Security;
using Socialize.Api.Modules.ContentItems.Contracts;
using Socialize.Api.Modules.ContentItems.Data;
using Socialize.Api.Modules.Notifications.Contracts;
using System.Text.Json;
namespace Socialize.Api.Modules.ContentItems.Handlers;
@@ -12,7 +14,8 @@ public record CreateContentItemRevisionRequest(
string PublicationMessage,
string PublicationTargets,
string? Hashtags,
string? ChangeSummary);
string? ChangeSummary,
DateTimeOffset? DueDate);
public class CreateContentItemRevisionRequestValidator
: Validator<CreateContentItemRevisionRequest>
@@ -30,6 +33,7 @@ public class CreateContentItemRevisionRequestValidator
public class CreateContentItemRevisionHandler(
AppDbContext dbContext,
AccessScopeService accessScopeService,
IContentItemActivityWriter activityWriter,
INotificationEventWriter notificationEventWriter)
: Endpoint<CreateContentItemRevisionRequest, ContentItemRevisionDto>
{
@@ -58,11 +62,21 @@ public class CreateContentItemRevisionHandler(
int revisionNumber = item.CurrentRevisionNumber + 1;
string revisionLabel = $"v{revisionNumber}";
string previousTitle = item.Title;
string previousPublicationMessage = item.PublicationMessage;
string previousPublicationTargets = item.PublicationTargets;
string? previousHashtags = item.Hashtags;
DateTimeOffset? previousDueDate = item.DueDate;
string newTitle = request.Title.Trim();
string newPublicationMessage = request.PublicationMessage.Trim();
string newPublicationTargets = request.PublicationTargets.Trim();
string? newHashtags = string.IsNullOrWhiteSpace(request.Hashtags) ? null : request.Hashtags.Trim();
item.Title = request.Title.Trim();
item.PublicationMessage = request.PublicationMessage.Trim();
item.PublicationTargets = request.PublicationTargets.Trim();
item.Hashtags = string.IsNullOrWhiteSpace(request.Hashtags) ? null : request.Hashtags.Trim();
item.Title = newTitle;
item.PublicationMessage = newPublicationMessage;
item.PublicationTargets = newPublicationTargets;
item.Hashtags = newHashtags;
item.DueDate = request.DueDate;
item.CurrentRevisionNumber = revisionNumber;
item.CurrentRevisionLabel = revisionLabel;
@@ -84,6 +98,32 @@ public class CreateContentItemRevisionHandler(
dbContext.ContentItemRevisions.Add(revision);
await dbContext.SaveChangesAsync(ct);
List<object> changedFields = [];
AddChangedField(changedFields, "title", previousTitle, item.Title);
AddChangedField(changedFields, "publicationMessage", previousPublicationMessage, item.PublicationMessage);
AddChangedField(changedFields, "publicationTargets", previousPublicationTargets, item.PublicationTargets);
AddChangedField(changedFields, "hashtags", previousHashtags, item.Hashtags);
AddChangedField(changedFields, "dueDate", previousDueDate, item.DueDate);
await activityWriter.WriteAsync(
new ContentItemActivityWriteModel(
item.WorkspaceId,
item.Id,
"content-item.revision.created",
"ContentItemRevision",
revision.Id,
$"Revision {revisionLabel} was created for {item.Title}.",
User.GetUserId(),
User.GetEmail(),
JsonSerializer.Serialize(new
{
revisionLabel,
revisionNumber,
changeSummary = revision.ChangeSummary,
changedFields,
})),
ct);
await notificationEventWriter.WriteAsync(
new NotificationEventWriteModel(
item.WorkspaceId,
@@ -112,4 +152,19 @@ public class CreateContentItemRevisionHandler(
await SendAsync(dto, StatusCodes.Status201Created, ct);
}
private static void AddChangedField<T>(List<object> changedFields, string field, T oldValue, T newValue)
{
if (EqualityComparer<T>.Default.Equals(oldValue, newValue))
{
return;
}
changedFields.Add(new
{
field,
oldValue,
newValue,
});
}
}