Files
Wino-Mail/Wino.Core.Domain/Validation/CalendarEventComposeResultValidator.cs
2026-03-07 01:46:07 +01:00

74 lines
2.8 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Net.Mail;
using Wino.Core.Domain.Exceptions;
using Wino.Core.Domain.Models.Calendar;
namespace Wino.Core.Domain.Validation;
public sealed class CalendarEventComposeResultValidator
{
public void Validate(CalendarEventComposeResult result)
{
ArgumentNullException.ThrowIfNull(result);
if (result.CalendarId == Guid.Empty)
throw new CalendarEventComposeValidationException(Translator.CalendarEventCompose_ValidationMissingCalendar);
if (result.AccountId == Guid.Empty)
throw new CalendarEventComposeValidationException(Translator.CalendarEventCompose_ValidationMissingCalendar);
if (string.IsNullOrWhiteSpace(result.Title))
throw new CalendarEventComposeValidationException(Translator.CalendarEventCompose_ValidationMissingTitle);
if (result.EndDate <= result.StartDate)
{
var message = result.IsAllDay
? Translator.CalendarEventCompose_ValidationInvalidAllDayRange
: Translator.CalendarEventCompose_ValidationInvalidTimeRange;
throw new CalendarEventComposeValidationException(message);
}
var missingAttachments = result.Attachments
.Where(attachment => string.IsNullOrWhiteSpace(attachment.FilePath) || !File.Exists(attachment.FilePath))
.Select(attachment => attachment.FileName)
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
if (missingAttachments.Count > 0)
{
throw new CalendarEventComposeValidationException(
string.Format(Translator.CalendarEventCompose_ValidationMissingAttachment, string.Join(", ", missingAttachments)));
}
var invalidAttendee = result.Attendees
.FirstOrDefault(attendee => string.IsNullOrWhiteSpace(attendee.Email) || !IsValidEmailAddress(attendee.Email.Trim()));
if (invalidAttendee != null)
throw new CalendarEventComposeValidationException(Translator.CalendarEventCompose_ValidationInvalidAttendee);
var duplicateAttendeeGroups = result.Attendees
.Where(attendee => !string.IsNullOrWhiteSpace(attendee.Email))
.GroupBy(attendee => attendee.Email.Trim(), StringComparer.OrdinalIgnoreCase)
.FirstOrDefault(group => group.Count() > 1);
if (duplicateAttendeeGroups != null)
throw new CalendarEventComposeValidationException(Translator.CalendarEventCompose_ValidationInvalidAttendee);
}
private static bool IsValidEmailAddress(string address)
{
try
{
var parsedAddress = new MailAddress(address);
return parsedAddress.Address.Equals(address, StringComparison.OrdinalIgnoreCase);
}
catch
{
return false;
}
}
}