public async Task <ActionResult <LegacyReleaseViewModel> > UpdateLegacyRelease(
     Guid id,
     LegacyReleaseUpdateViewModel legacyRelease)
 {
     return(await _legacyReleaseService
            .UpdateLegacyRelease(id, legacyRelease)
            .HandleFailuresOrOk());
 }
        public async Task <Either <ActionResult, LegacyReleaseViewModel> > UpdateLegacyRelease(
            Guid id,
            LegacyReleaseUpdateViewModel legacyReleaseUpdate)
        {
            return(await _persistenceHelper
                   .CheckEntityExists <LegacyRelease>(
                       id,
                       release => release.Include(r => r.Publication)
                       .ThenInclude(p => p.LegacyReleases)
                       )
                   .OnSuccess(_userService.CheckCanUpdateLegacyRelease)
                   .OnSuccess(async legacyRelease =>
            {
                legacyRelease.Description = legacyReleaseUpdate.Description;
                legacyRelease.Url = legacyReleaseUpdate.Url;
                legacyRelease.PublicationId = legacyReleaseUpdate.PublicationId;

                var publication = legacyRelease.Publication;

                if (legacyReleaseUpdate.Order != legacyRelease.Order)
                {
                    legacyRelease.Order = legacyReleaseUpdate.Order;

                    // Shift up orders of existing legacy releases
                    // to make space for updated legacy release.
                    publication.LegacyReleases
                    .FindAll(release => release.Order >= legacyReleaseUpdate.Order && release.Id != id)
                    .ForEach(release => release.Order++);

                    var currentOrder = 0;

                    // Re-order again to make sure orders are
                    // increased incrementally with no gaps.
                    publication.LegacyReleases
                    .OrderBy(release => release.Order)
                    .ToList()
                    .ForEach(release =>
                    {
                        currentOrder++;
                        release.Order = currentOrder;
                    });
                }

                _context.Update(legacyRelease);
                _context.Update(publication);

                await _context.SaveChangesAsync();

                await _publicBlobCacheService.DeleteItem(new PublicationCacheKey(publication.Slug));

                return _mapper.Map <LegacyReleaseViewModel>(legacyRelease);
            }));
        }