Initial feature for drag / drop calendar events.

This commit is contained in:
Burak Kaan Köse
2026-04-08 23:46:02 +02:00
parent a3c35dfae5
commit 3dc4ac03ec
30 changed files with 621 additions and 4 deletions
@@ -0,0 +1,15 @@
using System.Collections.Generic;
using Wino.Core.Domain.Entities.Calendar;
using Wino.Core.Domain.Enums;
namespace Wino.Core.Requests.Calendar;
/// <summary>
/// Request to move an existing calendar event by changing its start and end dates.
/// The item should already be updated in the local database before this request is queued.
/// </summary>
public record ChangeStartAndEndDateRequest(CalendarItem Item, List<CalendarEventAttendee> Attendees)
: UpdateCalendarEventRequest(Item, Attendees)
{
public override CalendarSynchronizerOperation Operation => CalendarSynchronizerOperation.ChangeStartAndEndDate;
}
@@ -177,6 +177,11 @@ public class WinoRequestDelegator : IWinoRequestDelegator
OriginalItem = calendarPreparationRequest.OriginalItem,
OriginalAttendees = calendarPreparationRequest.OriginalAttendees
},
CalendarSynchronizerOperation.ChangeStartAndEndDate => new ChangeStartAndEndDateRequest(calendarPreparationRequest.CalendarItem, calendarPreparationRequest.Attendees)
{
OriginalItem = calendarPreparationRequest.OriginalItem,
OriginalAttendees = calendarPreparationRequest.OriginalAttendees
},
_ => throw new NotImplementedException($"Calendar operation {calendarPreparationRequest.Operation} is not implemented yet.")
};
@@ -2807,6 +2807,9 @@ public class GmailSynchronizer : WinoSynchronizer<IClientServiceRequest, Message
return [new HttpRequestBundle<IClientServiceRequest>(updateRequest, request)];
}
public override List<IRequestBundle<IClientServiceRequest>> ChangeStartAndEndDate(ChangeStartAndEndDateRequest request)
=> UpdateCalendarEvent(request);
public override List<IRequestBundle<IClientServiceRequest>> DeleteCalendarEvent(DeleteCalendarEventRequest request)
{
var calendarItem = request.Item;
@@ -334,6 +334,15 @@ public class ImapSynchronizer : WinoSynchronizer<ImapRequest, ImapMessageCreatio
handler.RequiresConnectedClient);
}
public override List<IRequestBundle<ImapRequest>> ChangeStartAndEndDate(ChangeStartAndEndDateRequest request)
{
var handler = ResolveCalendarOperationHandler();
return CreateCalendarOperationTaskBundle(
request,
async value => await handler.UpdateCalendarEventAsync(value).ConfigureAwait(false),
handler.RequiresConnectedClient);
}
public override List<IRequestBundle<ImapRequest>> DeleteCalendarEvent(DeleteCalendarEventRequest request)
{
var handler = ResolveCalendarOperationHandler();
@@ -2856,6 +2856,9 @@ public class OutlookSynchronizer : WinoSynchronizer<RequestInformation, Message,
return [new HttpRequestBundle<RequestInformation>(updateRequest, request)];
}
public override List<IRequestBundle<RequestInformation>> ChangeStartAndEndDate(ChangeStartAndEndDateRequest request)
=> UpdateCalendarEvent(request);
public override List<IRequestBundle<RequestInformation>> DeleteCalendarEvent(DeleteCalendarEventRequest request)
{
var calendarItem = request.Item;
@@ -437,6 +437,11 @@ public abstract class WinoSynchronizer<TBaseRequest, TMessageType, TCalendarEven
.OfType<UpdateCalendarEventRequest>()
.SelectMany(UpdateCalendarEvent));
break;
case CalendarSynchronizerOperation.ChangeStartAndEndDate:
nativeRequests.AddRange(group
.OfType<ChangeStartAndEndDateRequest>()
.SelectMany(ChangeStartAndEndDate));
break;
case CalendarSynchronizerOperation.DeleteEvent:
nativeRequests.AddRange(group
.OfType<DeleteCalendarEventRequest>()
@@ -600,6 +605,7 @@ public abstract class WinoSynchronizer<TBaseRequest, TMessageType, TCalendarEven
public virtual List<IRequestBundle<TBaseRequest>> CreateCalendarEvent(CreateCalendarEventRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));
public virtual List<IRequestBundle<TBaseRequest>> UpdateCalendarEvent(UpdateCalendarEventRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));
public virtual List<IRequestBundle<TBaseRequest>> ChangeStartAndEndDate(ChangeStartAndEndDateRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));
public virtual List<IRequestBundle<TBaseRequest>> DeleteCalendarEvent(DeleteCalendarEventRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));
public virtual List<IRequestBundle<TBaseRequest>> AcceptEvent(AcceptEventRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));
public virtual List<IRequestBundle<TBaseRequest>> DeclineEvent(DeclineEventRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));