Ejemplo n.º 1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="galleryName"></param>
        /// <param name="imageName"></param>
        /// <param name="user"></param>
        /// <param name="removeVote"></param>
        /// <exception cref="HttpException">If something went wrong</exception>
        /// <returns></returns>
        public GalleryItem Vote(string galleryName, string imageName, IPrincipal user, bool? removeVote = null)
        {
            var galleryDirectory = GetGalleryDirectory(galleryName);

             FileInfo galleryFile;

             try
             {
            galleryFile = galleryDirectory.GetFiles(imageName).First();
             }
             catch (Exception)
             {
            throw new HttpException(512, "The image '" + imageName + "' is not in this gallery");
             }

             try
             {
            bool? voteStatus = null;
            var entities = new DatabaseEntities();

            var setting = (from set in entities.Settings where set.Gallery == galleryName select set).SingleOrDefault();
            if (setting == null || !setting.VotingEnabled)
            {
               throw new HttpException(511, "Voting is disabled for this gallery");
            }

            var ownedByUser = entities.Uploads.Any(upload => upload.Gallery == galleryName && upload.User == user.Identity.Name && upload.Image == imageName);
            if (ownedByUser)
            {
               throw new HttpException(513, "You cannot vote your own picture");
            }

            // gets all votes for this image
            var votes = from vote in entities.Votes
                        where vote.Gallery == galleryName && vote.Image == imageName
                        select vote;

            // ... and filter by user
            var userVote = votes.Where(vote => vote.User == user.Identity.Name).SingleOrDefault();
            if (userVote != null && removeVote != false)
            {
               // Set last change
               SetLastChange(galleryDirectory);

               // remove vote
               entities.DeleteObject(userVote);

               // commit
               entities.SaveChanges();

               // removed
               voteStatus = false;
            }
            else if (userVote == null)
            {
               // Set last change
               SetLastChange(galleryDirectory);

               // add new vote
               entities.Votes.AddObject(new Vote
               {
                  Gallery = galleryDirectory.Name,
                  Image = galleryFile.Name,
                  User = user.Identity.Name,
                  LastUpdate = DateTime.Now,
               });

               // commit
               entities.SaveChanges();

               // added
               voteStatus = true;
            }

            return new GalleryItem
            {
               FullPath = galleryFile.FullName,
               Name = galleryFile.Name,
               UserVote = voteStatus != false, // null or true
               TotalVotes = setting.StatsEnabled ? votes.Count() : 0,
               User = user.Identity.Name,
               Gallery = galleryName
            };
             }
             catch (HttpException)
             {
            throw;
             }
             catch (Exception ex)
             {
            throw new HttpException(520, "Unable to save changes. " + ex.Message);
             }
        }