private async Task <IEnumerable <ProgramScheduleItemViewModel> > PersistItems(
            ReplaceProgramScheduleItems request,
            ProgramSchedule programSchedule)
        {
            programSchedule.Items = request.Items.Map(i => BuildItem(programSchedule, i.Index, i)).ToList();

            await _programScheduleRepository.Update(programSchedule);

            // rebuild any playouts that use this schedule
            foreach (Playout playout in programSchedule.Playouts)
            {
                await _channel.WriteAsync(new BuildPlayout(playout.Id, true));
            }

            return(programSchedule.Items.Map(ProjectToViewModel));
        }
        private async Task <ProgramScheduleItemViewModel> PersistItem(
            AddProgramScheduleItem request,
            ProgramSchedule programSchedule)
        {
            int nextIndex = programSchedule.Items.Select(i => i.Index).DefaultIfEmpty(0).Max() + 1;

            ProgramScheduleItem item = BuildItem(programSchedule, nextIndex, request);

            programSchedule.Items.Add(item);

            await _programScheduleRepository.Update(programSchedule);

            // rebuild any playouts that use this schedule
            foreach (Playout playout in programSchedule.Playouts)
            {
                await _channel.WriteAsync(new BuildPlayout(playout.Id, true));
            }

            return(ProjectToViewModel(item));
        }
        private async Task <ProgramScheduleViewModel> ApplyUpdateRequest(
            ProgramSchedule programSchedule,
            UpdateProgramSchedule update)
        {
            // we only need to rebuild playouts if the playback order has been modified
            bool needToRebuildPlayout =
                programSchedule.MediaCollectionPlaybackOrder != update.MediaCollectionPlaybackOrder;

            programSchedule.Name = update.Name;
            programSchedule.MediaCollectionPlaybackOrder = update.MediaCollectionPlaybackOrder;
            await _programScheduleRepository.Update(programSchedule);

            if (needToRebuildPlayout)
            {
                foreach (Playout playout in programSchedule.Playouts)
                {
                    await _channel.WriteAsync(new BuildPlayout(playout.Id, true));
                }
            }

            return(ProjectToViewModel(programSchedule));
        }