Пример #1
0
        public async Task <OperationResult <Library.Models.Image> > UploadGenreImage(Library.Models.Users.User user, Guid id, IFormFile file)
        {
            var bytes = new byte[0];

            using (var ms = new MemoryStream())
            {
                file.CopyTo(ms);
                bytes = ms.ToArray();
            }

            return(await SaveImageBytes(user, id, bytes));
        }
Пример #2
0
        public async Task <IActionResult> UpdateProfile(Library.Models.Users.User model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            var user = await CurrentUserModel().ConfigureAwait(false);

            var result = await UserService.UpdateProfile(user, model).ConfigureAwait(false);

            if (result?.IsNotFoundResult != false)
            {
                return(NotFound());
            }
            if (!result.IsSuccess)
            {
                if (result.IsAccessDeniedResult)
                {
                    return(StatusCode((int)HttpStatusCode.Forbidden));
                }
                if (result.Messages?.Any() ?? false)
                {
                    return(StatusCode((int)HttpStatusCode.BadRequest, result.Messages));
                }
                return(StatusCode((int)HttpStatusCode.InternalServerError));
            }
            CacheManager.ClearRegion(ControllerCacheRegionUrn);
            var modelUser = await UserManager.FindByNameAsync(model.UserName).ConfigureAwait(false);

            var t = await TokenService.GenerateToken(modelUser, UserManager).ConfigureAwait(false);

            CacheManager.ClearRegion(ControllerCacheRegionUrn);
            var avatarUrl = $"{RoadieHttpContext.ImageBaseUrl}/user/{modelUser.RoadieId}/{RoadieSettings.ThumbnailImageSize.Width}/{RoadieSettings.ThumbnailImageSize.Height}";

            return(Ok(new
            {
                IsSuccess = true,
                Username = modelUser.UserName,
                modelUser.RemoveTrackFromQueAfterPlayed,
                modelUser.Email,
                modelUser.LastLogin,
                avatarUrl,
                Token = t,
                modelUser.Timeformat,
                modelUser.Timezone,
                DefaultRowsPerPage = modelUser.DefaultRowsPerPage ?? RoadieSettings.DefaultRowsPerPage
            }));
        }
Пример #3
0
        public async Task <OperationResult <Label> > ById(Library.Models.Users.User roadieUser, Guid id, IEnumerable <string> includes = null)
        {
            var sw = Stopwatch.StartNew();

            sw.Start();
            var cacheKey = string.Format("urn:label_by_id_operation:{0}:{1}", id,
                                         includes == null ? "0" : string.Join("|", includes));
            var result = await CacheManager.GetAsync(cacheKey,
                                                     async() => { return(await LabelByIdAction(id, includes)); }, data.Label.CacheRegionUrn(id));

            sw.Stop();
            if (result?.Data != null && roadieUser != null)
            {
                var userBookmarkResult = await BookmarkService.List(roadieUser, new PagedRequest(), false, BookmarkType.Label);

                if (userBookmarkResult.IsSuccess)
                {
                    result.Data.UserBookmarked = userBookmarkResult?.Rows?.FirstOrDefault(x => x?.Bookmark?.Value == result?.Data?.Id?.ToString()) != null;
                }
                if (result.Data.Comments.Any())
                {
                    var commentIds           = result.Data.Comments.Select(x => x.DatabaseId).ToArray();
                    var userCommentReactions = (from cr in DbContext.CommentReactions
                                                where commentIds.Contains(cr.CommentId)
                                                where cr.UserId == roadieUser.Id
                                                select cr).ToArray();
                    foreach (var comment in result.Data.Comments)
                    {
                        var userCommentReaction = userCommentReactions.FirstOrDefault(x => x.CommentId == comment.DatabaseId);
                        comment.IsDisliked = userCommentReaction?.ReactionValue == CommentReaction.Dislike;
                        comment.IsLiked    = userCommentReaction?.ReactionValue == CommentReaction.Like;
                    }
                }
            }

            return(new OperationResult <Label>(result.Messages)
            {
                Data = result?.Data,
                IsNotFoundResult = result?.IsNotFoundResult ?? false,
                Errors = result?.Errors,
                IsSuccess = result?.IsSuccess ?? false,
                OperationTime = sw.ElapsedMilliseconds
            });
        }
Пример #4
0
        private async Task <OperationResult <Library.Models.Image> > SaveImageBytes(Library.Models.Users.User user, Guid id, byte[] imageBytes)
        {
            var sw = new Stopwatch();

            sw.Start();
            var errors = new List <Exception>();
            var genre  = DbContext.Genres.FirstOrDefault(x => x.RoadieId == id);

            if (genre == null)
            {
                return(new OperationResult <Library.Models.Image>(true, string.Format("Genre Not Found [{0}]", id)));
            }
            try
            {
                var now = DateTime.UtcNow;
                if (imageBytes != null)
                {
                    // Save unaltered genre image
                    File.WriteAllBytes(genre.PathToImage(Configuration, true), ImageHelper.ConvertToJpegFormat(imageBytes));
                }
                genre.LastUpdated = now;
                await DbContext.SaveChangesAsync();

                CacheManager.ClearRegion(genre.CacheRegion);
                Logger.LogInformation($"UploadGenreImage `{genre}` By User `{user}`");
            }
            catch (Exception ex)
            {
                Logger.LogError(ex);
                errors.Add(ex);
            }

            sw.Stop();

            return(new OperationResult <Library.Models.Image>
            {
                IsSuccess = !errors.Any(),
                Data = ImageHelper.MakeThumbnailImage(Configuration, HttpContext, id, "genre", Configuration.MediumImageSize.Width, Configuration.MediumImageSize.Height, true),
                OperationTime = sw.ElapsedMilliseconds,
                Errors = errors
            });
        }
Пример #5
0
        public async Task <OperationResult <Genre> > ById(Library.Models.Users.User roadieUser, Guid id, IEnumerable <string> includes = null)
        {
            var sw = Stopwatch.StartNew();

            sw.Start();
            var cacheKey = string.Format("urn:genre_by_id_operation:{0}:{1}", id, includes == null ? "0" : string.Join("|", includes));
            var result   = await CacheManager.GetAsync(cacheKey, async() =>
            {
                return(await GenreByIdAction(id, includes));
            }, data.Genre.CacheRegionUrn(id));

            sw.Stop();
            return(new OperationResult <Genre>(result.Messages)
            {
                Data = result?.Data,
                IsNotFoundResult = result?.IsNotFoundResult ?? false,
                Errors = result?.Errors,
                IsSuccess = result?.IsSuccess ?? false,
                OperationTime = sw.ElapsedMilliseconds
            });
        }
Пример #6
0
        public async Task <Library.Models.Pagination.PagedResult <GenreList> > List(Library.Models.Users.User roadieUser, PagedRequest request, bool?doRandomize = false)
        {
            var sw = new Stopwatch();

            sw.Start();

            int?rowCount = null;

            if (!string.IsNullOrEmpty(request.Sort))
            {
                request.Sort = request.Sort.Replace("createdDate", "createdDateTime");
                request.Sort = request.Sort.Replace("lastUpdated", "lastUpdatedDateTime");
            }

            int[] randomGenreIds = null;
            SortedDictionary <int, int> randomGenreData = null;

            if (doRandomize ?? false)
            {
                var randomLimit = request.Limit ?? roadieUser?.RandomReleaseLimit ?? request.LimitValue;
                randomGenreData = await DbContext.RandomGenreIds(roadieUser?.Id ?? -1, randomLimit, request.FilterFavoriteOnly, request.FilterRatedOnly);

                randomGenreIds = randomGenreData.Select(x => x.Value).ToArray();
                rowCount       = DbContext.Genres.Count();
            }

            var result = from g in DbContext.Genres
                         where randomGenreIds == null || randomGenreIds.Contains(g.Id)
                         let releaseCount = (from rg in DbContext.ReleaseGenres
                                             where rg.GenreId == g.Id
                                             select rg.Id).Count()
                                            let artistCount = (from rg in DbContext.ArtistGenres
                                                               where rg.GenreId == g.Id
                                                               select rg.Id).Count()
                                                              where request.FilterValue.Length == 0 || g.Name.Contains(request.FilterValue)
                                                              select new GenreList
            {
                DatabaseId = g.Id,
                Id         = g.RoadieId,
                Genre      = new DataToken
                {
                    Text  = g.Name,
                    Value = g.RoadieId.ToString()
                },
                ReleaseCount = releaseCount,
                ArtistCount  = artistCount,
                CreatedDate  = g.CreatedDate,
                LastUpdated  = g.LastUpdated,
                Thumbnail    = ImageHelper.MakeGenreThumbnailImage(Configuration, HttpContext, g.RoadieId)
            };

            GenreList[] rows;
            rowCount = rowCount ?? result.Count();
            if (doRandomize ?? false)
            {
                var resultData = result.ToArray();
                rows = (from r in resultData
                        join ra in randomGenreData on r.DatabaseId equals ra.Value
                        orderby ra.Key
                        select r
                        ).ToArray();
            }
            else
            {
                var sortBy = string.IsNullOrEmpty(request.Sort)
                    ? request.OrderValue(new Dictionary <string, string> {
                    { "Genre.Text", "ASC" }
                })
                    : request.OrderValue();
                rows = result.OrderBy(sortBy).Skip(request.SkipValue).Take(request.LimitValue).ToArray();
            }

            sw.Stop();
            return(new Library.Models.Pagination.PagedResult <GenreList>
            {
                TotalCount = rowCount.Value,
                CurrentPage = request.PageValue,
                TotalPages = (int)Math.Ceiling((double)rowCount / request.LimitValue),
                OperationTime = sw.ElapsedMilliseconds,
                Rows = rows
            });
        }
Пример #7
0
        public async Task <OperationResult <bool> > UpdateGenre(Library.Models.Users.User user, Genre model)
        {
            var sw = new Stopwatch();

            sw.Start();
            var errors = new List <Exception>();
            var genre  = DbContext.Genres.FirstOrDefault(x => x.RoadieId == model.Id);

            if (genre == null)
            {
                return(new OperationResult <bool>(true, string.Format("Genre Not Found [{0}]", model.Id)));
            }
            // If genre is being renamed, see if genre already exists with new model supplied name
            var genreName      = genre.SortNameValue;
            var genreModelName = genre.SortNameValue;
            var didChangeName  = !genreName.ToAlphanumericName().Equals(genreModelName.ToAlphanumericName(), StringComparison.OrdinalIgnoreCase);

            if (didChangeName)
            {
                var existingGenre = DbContext.Genres.FirstOrDefault(x => x.Name == model.Name || x.SortName == model.SortName);
                if (existingGenre != null)
                {
                    return(new OperationResult <bool>($"Genre already exists `{ existingGenre }` with name [{ genreModelName }]."));
                }
            }
            try
            {
                var now = DateTime.UtcNow;
                var specialGenreName = model.Name.ToAlphanumericName();
                var alt = new List <string>(model.AlternateNamesList);
                if (!model.AlternateNamesList.Contains(specialGenreName, StringComparer.OrdinalIgnoreCase))
                {
                    alt.Add(specialGenreName);
                }
                genre.AlternateNames = alt.ToDelimitedList();
                genre.Description    = model.Description;
                genre.IsLocked       = model.IsLocked;
                var oldPathToImage = genre.PathToImage(Configuration);
                genre.Name           = model.Name;
                genre.NormalizedName = model.NormalizedName;
                genre.SortName       = model.SortName;
                genre.Status         = SafeParser.ToEnum <Statuses>(model.Status);
                genre.Tags           = model.TagsList.ToDelimitedList();

                if (didChangeName)
                {
                    if (File.Exists(oldPathToImage))
                    {
                        File.Move(oldPathToImage, genre.PathToImage(Configuration));
                    }
                }
                var genreImage = ImageHelper.ImageDataFromUrl(model.NewThumbnailData);
                if (genreImage != null)
                {
                    // Save unaltered genre image
                    File.WriteAllBytes(genre.PathToImage(Configuration), ImageHelper.ConvertToJpegFormat(genreImage));
                }
                genre.LastUpdated = now;
                await DbContext.SaveChangesAsync();

                CacheManager.ClearRegion(genre.CacheRegion);
                Logger.LogInformation($"UpdateGenre `{genre}` By User `{user}`");
            }
            catch (Exception ex)
            {
                Logger.LogError(ex);
                errors.Add(ex);
            }

            sw.Stop();

            return(new OperationResult <bool>
            {
                IsSuccess = !errors.Any(),
                Data = !errors.Any(),
                OperationTime = sw.ElapsedMilliseconds,
                Errors = errors
            });
        }
Пример #8
0
 public async Task <OperationResult <Library.Models.Image> > SetGenreImageByUrl(Library.Models.Users.User user, Guid id, string imageUrl)
 {
     return(await SaveImageBytes(user, id, WebHelper.BytesForImageUrl(imageUrl)));
 }
Пример #9
0
        public async Task <OperationResult <bool> > UpdateLabel(Library.Models.Users.User user, Label model)
        {
            var sw = new Stopwatch();

            sw.Start();
            var errors = new List <Exception>();
            var label  = DbContext.Labels.FirstOrDefault(x => x.RoadieId == model.Id);

            if (label == null)
            {
                return(new OperationResult <bool>(true, string.Format("Label Not Found [{0}]", model.Id)));
            }
            // If label is being renamed, see if label already exists with new model supplied name
            var labelName      = label.SortNameValue;
            var labelModelName = model.SortNameValue;
            var oldPathToImage = label.PathToImage(Configuration);
            var didChangeName  = !labelName.ToAlphanumericName().Equals(labelModelName.ToAlphanumericName(), StringComparison.OrdinalIgnoreCase);

            if (didChangeName)
            {
                var existingLabel = DbContext.Labels.FirstOrDefault(x => x.Name == model.Name || x.SortName == model.SortName);
                if (existingLabel != null)
                {
                    return(new OperationResult <bool>($"Label already exists `{ existingLabel }` with name [{ labelModelName }]."));
                }
            }
            try
            {
                var now = DateTime.UtcNow;
                var specialLabelName = model.Name.ToAlphanumericName();
                var alt = new List <string>(model.AlternateNamesList);
                if (!model.AlternateNamesList.Contains(specialLabelName, StringComparer.OrdinalIgnoreCase))
                {
                    alt.Add(specialLabelName);
                }
                label.AlternateNames = alt.ToDelimitedList();
                label.BeginDate      = model.BeginDate;
                label.DiscogsId      = model.DiscogsId;
                label.EndDate        = model.EndDate;
                label.IsLocked       = model.IsLocked;
                label.MusicBrainzId  = model.MusicBrainzId;
                label.Name           = model.Name;
                label.Profile        = model.Profile;
                label.SortName       = model.SortName;
                label.Status         = SafeParser.ToEnum <Statuses>(model.Status);
                label.Tags           = model.TagsList.ToDelimitedList();
                label.URLs           = model.URLsList.ToDelimitedList();

                if (didChangeName)
                {
                    if (File.Exists(oldPathToImage))
                    {
                        File.Move(oldPathToImage, label.PathToImage(Configuration));
                    }
                }
                var labelImage = ImageHelper.ImageDataFromUrl(model.NewThumbnailData);
                if (labelImage != null)
                {
                    // Save unaltered label image
                    File.WriteAllBytes(label.PathToImage(Configuration, true), ImageHelper.ConvertToJpegFormat(labelImage));
                }
                label.LastUpdated = now;
                await DbContext.SaveChangesAsync();

                CacheManager.ClearRegion(label.CacheRegion);
                Logger.LogInformation($"UpdateLabel `{label}` By User `{user}`");
            }
            catch (Exception ex)
            {
                Logger.LogError(ex);
                errors.Add(ex);
            }

            sw.Stop();

            return(new OperationResult <bool>
            {
                IsSuccess = !errors.Any(),
                Data = !errors.Any(),
                OperationTime = sw.ElapsedMilliseconds,
                Errors = errors
            });
        }
Пример #10
0
        public async Task <Library.Models.Pagination.PagedResult <LabelList> > List(Library.Models.Users.User roadieUser, PagedRequest request,
                                                                                    bool?doRandomize = false)
        {
            var sw = new Stopwatch();

            sw.Start();

            int?rowCount = null;

            if (!string.IsNullOrEmpty(request.Sort))
            {
                request.Sort = request.Sort.Replace("createdDate", "createdDateTime");
                request.Sort = request.Sort.Replace("lastUpdated", "lastUpdatedDateTime");
            }

            var normalizedFilterValue = !string.IsNullOrEmpty(request.FilterValue)
                ? request.FilterValue.ToAlphanumericName()
                : null;

            int[] randomLabelIds = null;
            SortedDictionary <int, int> randomLabelData = null;

            if (doRandomize ?? false)
            {
                var randomLimit = request.Limit ?? roadieUser?.RandomReleaseLimit ?? request.LimitValue;
                randomLabelData = await DbContext.RandomLabelIds(roadieUser?.Id ?? -1, randomLimit, request.FilterFavoriteOnly, request.FilterRatedOnly);

                randomLabelIds = randomLabelData.Select(x => x.Value).ToArray();
                rowCount       = DbContext.Labels.Count();
            }

            var result = from l in DbContext.Labels
                         where randomLabelIds == null || randomLabelIds.Contains(l.Id)
                         where request.FilterValue == "" || (
                l.Name.Contains(request.FilterValue) ||
                l.SortName.Contains(request.FilterValue) ||
                l.AlternateNames.Contains(request.FilterValue) ||
                l.AlternateNames.Contains(normalizedFilterValue)
                )
                         select new LabelList
            {
                DatabaseId = l.Id,
                Id         = l.RoadieId,
                Label      = new DataToken
                {
                    Text  = l.Name,
                    Value = l.RoadieId.ToString()
                },
                SortName     = l.SortName,
                CreatedDate  = l.CreatedDate,
                LastUpdated  = l.LastUpdated,
                ArtistCount  = l.ArtistCount,
                ReleaseCount = l.ReleaseCount,
                TrackCount   = l.TrackCount,
                Thumbnail    = ImageHelper.MakeLabelThumbnailImage(Configuration, HttpContext, l.RoadieId)
            };

            LabelList[] rows = null;
            rowCount = rowCount ?? result.Count();
            if (doRandomize ?? false)
            {
                var resultData = result.ToArray();
                rows = (from r in resultData
                        join ra in randomLabelData on r.DatabaseId equals ra.Value
                        orderby ra.Key
                        select r
                        ).ToArray();
            }
            else
            {
                var sortBy = string.IsNullOrEmpty(request.Sort)
                    ? request.OrderValue(new Dictionary <string, string> {
                    { "SortName", "ASC" }, { "Label.Text", "ASC" }
                })
                    : request.OrderValue();
                rows = result
                       .OrderBy(sortBy)
                       .Skip(request.SkipValue)
                       .Take(request.LimitValue)
                       .ToArray();
            }

            sw.Stop();
            return(new Library.Models.Pagination.PagedResult <LabelList>
            {
                TotalCount = rowCount.Value,
                CurrentPage = request.PageValue,
                TotalPages = (int)Math.Ceiling((double)rowCount / request.LimitValue),
                OperationTime = sw.ElapsedMilliseconds,
                Rows = rows
            });
        }