Beispiel #1
0
        public async Task <IActionResult> UpdateSticker([FromRoute] long id, EditStickerViewModel viewModel)
        {
            if (!ModelState.IsValid)
            {
                throw new Exception("Not valid");
            }

            var userId  = User.FindFirst(ClaimTypes.NameIdentifier).Value;
            var user    = _dbContext.Users.First(m => m.Id == userId);
            var sticker = _dbContext.Stickers.Include(m => m.StickerTags).ThenInclude(m => m.Tag).FirstOrDefault(m => m.Id == id && m.User.Id == userId);

            if (sticker == null)
            {
                return(NotFound());
            }

            if (string.IsNullOrEmpty(viewModel.Title))
            {
                return(BadRequest());
            }

            if (string.IsNullOrEmpty(viewModel.Description))
            {
                return(BadRequest());
            }

            if (viewModel.Height <= 0)
            {
                return(BadRequest());
            }

            if (viewModel.Width <= 0)
            {
                return(BadRequest());
            }

            if (viewModel.Quantity <= 0)
            {
                return(BadRequest());
            }

            if (viewModel.Credits <= 0)
            {
                return(BadRequest());
            }

            var tags = viewModel.Tags.Split(',').Select(m => m.ToLower());

            var existingTags = _dbContext.Tags.Where(m => tags.Contains(m.Name));
            var newTags      = new List <Tag>();

            foreach (var tag in tags.Where(m => !existingTags.Any(x => x.Name.Equals(m))))
            {
                var newTag = new Tag
                {
                    Name = tag
                };

                newTags.Add(newTag);
                _dbContext.Add(newTag);
            }

            var allTags = existingTags.Concat(newTags);

            if (viewModel.Quantity > 0)
            {
                user.Credits += viewModel.Quantity - sticker.Quantity;
            }

            sticker.Height      = viewModel.Height;
            sticker.Width       = viewModel.Width;
            sticker.Description = viewModel.Description;
            sticker.Title       = viewModel.Title;
            sticker.Quantity    = viewModel.Quantity;
            sticker.Credits     = viewModel.Credits;

            if (viewModel.Image != null)
            {
                sticker.BlobMediaType = viewModel.Image.ContentType;

                using (var memoryStream = new MemoryStream())
                {
                    await viewModel.Image.CopyToAsync(memoryStream);

                    sticker.Blob = memoryStream.ToArray();
                }

                ResizeImage(sticker);
            }

            _dbContext.StickerTags.RemoveRange(sticker.StickerTags);

            foreach (var tag in allTags)
            {
                var stickerTag = new StickerTag
                {
                    Tag     = tag,
                    Sticker = sticker
                };
                _dbContext.Add(stickerTag);
            }

            await _dbContext.SaveChangesAsync();

            return(RedirectToAction("Index", new { id = sticker.Id }));
        }
Beispiel #2
0
        public async Task <IActionResult> Create(CreateStickerViewModel viewModel)
        {
            if (!ModelState.IsValid)
            {
                throw new Exception("Not Valid");
            }

            var userId = User.FindFirst(ClaimTypes.NameIdentifier).Value;
            var user   = _dbContext.Users.First(m => m.Id == userId);

            if (string.IsNullOrEmpty(viewModel.Title))
            {
                return(BadRequest());
            }

            if (string.IsNullOrEmpty(viewModel.Description))
            {
                return(BadRequest());
            }

            if (viewModel.Height <= 0)
            {
                return(BadRequest());
            }

            if (viewModel.Width <= 0)
            {
                return(BadRequest());
            }

            if (viewModel.Quantity <= 0)
            {
                return(BadRequest());
            }

            if (viewModel.Credits <= 0)
            {
                return(BadRequest());
            }

            var tags = viewModel.Tags.Split(',').Select(m => m.ToLower());

            var existingTags = _dbContext.Tags.Where(m => tags.Contains(m.Name));
            var newTags      = new List <Tag>();

            foreach (var tag in tags.Where(m => !existingTags.Any(x => x.Name.Equals(m))))
            {
                var newTag = new Tag
                {
                    Name = tag
                };

                newTags.Add(newTag);
                _dbContext.Add(newTag);
            }

            var allTags = existingTags.Concat(newTags);

            var product = new Sticker
            {
                Created       = DateTime.UtcNow,
                Description   = viewModel.Description,
                Title         = viewModel.Title,
                Height        = viewModel.Height,
                Width         = viewModel.Width,
                Quantity      = viewModel.Quantity,
                Credits       = viewModel.Credits,
                User          = user,
                BlobMediaType = viewModel.Image.ContentType
            };

            user.Credits += viewModel.Quantity;

            using (var memoryStream = new MemoryStream())
            {
                await viewModel.Image.CopyToAsync(memoryStream);

                product.Blob = memoryStream.ToArray();

                ResizeImage(product);
            }

            _dbContext.Add(product);

            foreach (var tag in allTags)
            {
                var stickerTag = new StickerTag
                {
                    Tag     = tag,
                    Sticker = product
                };
                _dbContext.Add(stickerTag);
            }

            await _dbContext.SaveChangesAsync();

            return(RedirectToAction("Index", new { id = product.Id }));
        }