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)); }
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 })); }
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 }); }
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 }); }
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 }); }
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 }); }
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 }); }
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))); }
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 }); }
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 }); }