public async Task <int> Handle(EditVolunteerTaskCommand message)
        {
            var volunteerTask = await _context.VolunteerTasks.Include(t => t.RequiredSkills).SingleOrDefaultAsync(t => t.Id == message.VolunteerTask.Id) ?? new VolunteerTask();

            volunteerTask.Name         = message.VolunteerTask.Name;
            volunteerTask.Description  = message.VolunteerTask.Description;
            volunteerTask.Event        = _context.Events.SingleOrDefault(a => a.Id == message.VolunteerTask.EventId);
            volunteerTask.Organization = _context.Organizations.SingleOrDefault(t => t.Id == message.VolunteerTask.OrganizationId);

            volunteerTask.StartDateTime = message.VolunteerTask.StartDateTime;
            volunteerTask.EndDateTime   = message.VolunteerTask.EndDateTime;

            volunteerTask.NumberOfVolunteersRequired = message.VolunteerTask.NumberOfVolunteersRequired;
            volunteerTask.IsLimitVolunteers          = volunteerTask.Event.IsLimitVolunteers;
            volunteerTask.IsAllowWaitList            = volunteerTask.Event.IsAllowWaitList;

            if (volunteerTask.Id > 0)
            {
                var volunteerTaskSkillsToRemove = _context.VolunteerTaskSkills.Where(ts => ts.VolunteerTaskId == volunteerTask.Id && (message.VolunteerTask.RequiredSkills == null || message.VolunteerTask.RequiredSkills.All(ts1 => ts1.SkillId != ts.SkillId)));
                _context.VolunteerTaskSkills.RemoveRange(volunteerTaskSkillsToRemove);
            }

            if (message.VolunteerTask.RequiredSkills != null)
            {
                volunteerTask.RequiredSkills.AddRange(message.VolunteerTask.RequiredSkills.Where(mt => volunteerTask.RequiredSkills.All(ts => ts.SkillId != mt.SkillId)));
            }

            _context.AddOrUpdate(volunteerTask);

            // Delete existing attachments
            if (message.VolunteerTask.DeleteAttachments.Count > 0)
            {
                var attachmentsToDelete = _context.Attachments.Where(a => a.Task.Id == volunteerTask.Id && message.VolunteerTask.DeleteAttachments.Contains(a.Id)).ToList();
                _context.RemoveRange(attachmentsToDelete);
            }

            // Add new attachment
            if (message.VolunteerTask.NewAttachment != null && !string.IsNullOrEmpty(message.VolunteerTask.NewAttachment.FileName))
            {
                var attachmentModel = message.VolunteerTask.NewAttachment;
                var attachmentUrl   = await _taskAttachmentService.UploadAsync(message.VolunteerTask.Id, attachmentModel);

                var attachment = new FileAttachment
                {
                    Name        = attachmentModel.FileName,
                    Description = message.VolunteerTask.NewAttachmentDescription,
                    Url         = attachmentUrl,
                    Task        = volunteerTask,
                };

                _context.Add(attachment);
            }

            await _context.SaveChangesAsync();

            return(volunteerTask.Id);
        }