public async Task <IActionResult> Add(CreateAlbumViewModel model)
        {
            AlbumViewModelMapper mapper = new AlbumViewModelMapper();
            PublishStatus        flags  = PublishStatus.PUBLISHED | PublishStatus.UNPUBLISHED;
            var artistNames             = await _artistRepo.ListNamesAsync(flags);

            model.ArtistOptions = artistNames
                                  .Select(x => new SelectListItem
            {
                Text     = x.Name,
                Value    = x.Id.ToString(),
                Selected = x.Id == model.ArtistId
            }).ToList();
            List <CheckBoxListItem> groupOptions = (await _albumGroupRepo.ListAsync())
                                                   .Select(x => new CheckBoxListItem
            {
                Label      = x.Name,
                Value      = x.Key,
                IsSelected = model.Groups.Any(grp => grp.IsSelected && grp.Value == x.Key)
            }).ToList();

            model.Groups = groupOptions;

            if (ModelState.IsValid)
            {
                int?createdImageId = null;
                if (model.CoverImage != null && model.CoverImage.Length > 0)
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        await model.CoverImage.CopyToAsync(ms);

                        ImageReferenceDetail imageRef = await _imageRepo.AddAsync(new ImageReferenceDetail
                        {
                            Data     = ms.ToArray(),
                            FileName = model.CoverImage.FileName,
                            MimeType = model.CoverImage.ContentType
                        });

                        if (imageRef != null)
                        {
                            createdImageId = imageRef.Id;
                        }
                    }
                }


                var result = await _albumRepo.AddAsync(mapper.Map(model, createdImageId));

                await _albumGroupRepo.SetGroupsForAlbum(result.Id, model.Groups.Where(g => g.IsSelected).Select(g => g.Value).ToList());

                this.SetBootstrapPageAlert("Success", "Album added", BootstrapAlertType.success);
                return(RedirectToAction(nameof(Index)));
            }
            else
            {
                return(View(model));
            }
        }
        public async Task <IActionResult> Index([FromQuery] int page = 0, PublishStatus?status = null)
        {
            AlbumIndexViewModel model = new AlbumIndexViewModel();

            page = Math.Max(page, 0);
            PublishStatus flags = PublishStatus.PUBLISHED | PublishStatus.UNPUBLISHED;

            if (status.HasValue)
            {
                flags = status.Value;
            }
            var result = await _albumRepo.ListAsync(page, _pageSize, flags);

            model.PageIndex  = result.PageIndex;
            model.PageSize   = result.PageSize;
            model.TotalPages = (int)Math.Ceiling(((double)result.TotalItems / (double)result.PageSize));

            AlbumViewModelMapper mapper = new AlbumViewModelMapper();

            model.Items.AddRange(result.Items.Select(i => mapper.Map(i)));

            return(View(model));
        }
        public async Task <IActionResult> Edit(int id)
        {
            AlbumViewModelMapper mapper = new AlbumViewModelMapper();
            EditAlbumViewModel   model  = new EditAlbumViewModel();


            var genresResult = await _genreRepo.ListAsync(contentPublicationFlags : PublishStatus.PUBLISHED);

            var allGroups = await _albumGroupRepo.ListAsync();

            var albumGroupKeys = (await _albumGroupRepo.GetGroupsForAlbum(id)).Select(x => x.Key);


            AlbumDetail album = await _albumRepo.GetAsync(id);

            if (album != null)
            {
                PublishStatus flags = PublishStatus.PUBLISHED | PublishStatus.UNPUBLISHED;
                ICollection <ArtistNameRef> artistNames = await _artistRepo.ListNamesAsync(flags);

                model        = mapper.Map(album, artistNames, genresResult.Genres);
                model.Groups = allGroups.Select(x => new CheckBoxListItem
                {
                    Label      = x.Name,
                    Value      = x.Key,
                    IsSelected = (albumGroupKeys.Contains(x.Key))
                }).ToList();

                return(View(model));
            }
            else
            {
                // todo: show error message
                return(RedirectToAction(nameof(Index)));
            }
        }