public IActionResult Put(Guid key, [FromBody] ListingCreateOrUpdate update)
        {
            if (!Exists(key))
            {
                return(NotFound());
            }

            return(Ok(_listingService.updateListing(key, update)));
        }
        public ListingDTO createListing(ListingCreateOrUpdate listingDTO)
        {
            Listing listing = new Listing()
            {
                name        = listingDTO.name,
                description = listingDTO.description,
                created     = DateTime.UtcNow,
                modified    = DateTime.UtcNow,
                price       = listingDTO.price
            };

            User currentUser = _currentUserService.GetCurrentUser();

            listing.userId = currentUser.id;
            Guid key = _ctx.Listings.Add(listing).Entity.id.Value;

            foreach (string tag in listingDTO.tags)
            {
                _ctx.ListingTags.Add(new ListingTag()
                {
                    name      = tag,
                    listingId = key
                });
            }

            if (null != listingDTO.image && FileHelper.IsImage(listingDTO.image))
            {
                byte[] fileContents = null;
                using (var fs1 = listingDTO.image.OpenReadStream())
                    using (var ms1 = new MemoryStream())
                    {
                        fs1.CopyTo(ms1);
                        fileContents = ms1.ToArray();
                    }

                _ctx.ListingImages.Add(new ListingImage()
                {
                    listingId   = key,
                    contentType = listingDTO.image.ContentType,
                    image       = fileContents,
                    fileName    = Path.GetFileName(listingDTO.image.FileName)
                });
            }

            _ctx.SaveChanges();

            Listing result = _ctx.Listings
                             .Include(l => l.user)
                             .Include(l => l.tags)
                             .Where(l => l.id == key)
                             .FirstOrDefault();

            return(_mapper.Map <ListingDTO>(result));
        }
        public ListingDTO updateListing(Guid key, ListingCreateOrUpdate update)
        {
            Listing original    = _ctx.Listings.AsNoTracking().FirstOrDefault(p => p.id == key);
            User    currentUser = _currentUserService.GetCurrentUser();

            if (null != update.tags)
            {
                foreach (ListingTag doomedTag in _ctx.ListingTags.Where(t => t.listingId == key))
                {
                    _ctx.ListingTags.Remove(doomedTag);
                }

                foreach (string tag in update.tags)
                {
                    _ctx.ListingTags.Add(new ListingTag()
                    {
                        name      = tag,
                        listingId = key
                    });
                }
            }

            if (null != update.image && FileHelper.IsImage(update.image))
            {
                ListingImage existing = _ctx.ListingImages.FirstOrDefault(li => li.listingId == key);
                if (null != existing)
                {
                    _ctx.ListingImages.Remove(existing);
                }

                byte[] fileContents = null;
                using (var fs1 = update.image.OpenReadStream())
                    using (var ms1 = new MemoryStream())
                    {
                        fs1.CopyTo(ms1);
                        fileContents = ms1.ToArray();
                    }

                _ctx.ListingImages.Add(new ListingImage()
                {
                    listingId   = key,
                    contentType = update.image.ContentType,
                    image       = fileContents,
                    fileName    = Path.GetFileName(update.image.FileName)
                });
            }

            original.name              = update.name;
            original.description       = update.description;
            original.modified          = DateTime.UtcNow;
            original.price             = update.price;
            _ctx.Entry(original).State = EntityState.Modified;
            _ctx.SaveChanges();

            Listing result = _ctx.Listings
                             .Include(l => l.user)
                             .Include(l => l.tags)
                             .Where(l => l.id == key)
                             .FirstOrDefault();

            return(_mapper.Map <ListingDTO>(result));
        }
 public IActionResult Post([FromBody] ListingCreateOrUpdate listingDTO)
 {
     return(Ok(_listingService.createListing(listingDTO)));
 }