Пример #1
0
        public IHttpActionResult Accept(Guid id)
        {
            Answer   answer   = db.Answers.Find(id);
            Question question = answer.Question;

            if (answer.Accepted == false)
            {
                var questionHasAnwser = question.Answers.Any(x => x.Accepted);
                if (!questionHasAnwser)
                {
                    string userId = User.Identity.GetUserId();
                    if (question.UserID != userId)
                    {
                        return(Unauthorized());
                    }

                    answer.AspNetUser.Credits        += question.Bounty;
                    answer.Accepted                   = true;
                    db.Entry(answer.AspNetUser).State = EntityState.Modified;
                    db.Entry(answer).State            = EntityState.Modified;
                    PointsUtils.AddCreditsAndXP(answer.AspNetUser.Id, answer.Question.CategoryID, 25, 40);
                    db.SaveChanges();
                }
            }

            return(Ok(new AnswerDTO(answer)));
        }
Пример #2
0
        public async Task <IActionResult> Details(int?id)
        {
            IActionResult actionResult = null;

            var viewModel = new UserDetailsViewModel();

            var attendee = id.HasValue
                ? await this.DatabaseContext.Attendee
                           .FirstOrDefaultAsync(m => m.UserID == id)
                : null;

            if (attendee == null)
            {
                actionResult = this.NotFound();
            }
            else
            {
                viewModel.User = attendee;

                viewModel.PointsBalance = PointsUtils.GetPointsForUser(
                    attendee.UserID,
                    this.DatabaseContext);

                actionResult = this.View(viewModel);
            }

            return(actionResult);
        }
Пример #3
0
        public async Task <IActionResult> CheckBalance(string UserNumber)
        {
            var viewModel = new CheckBalanceJsonViewModel();

            try
            {
                //validate
                var user = await _context.User.FirstOrDefaultAsync(i => i.UserNumber == UserNumber);

                if (user == null)
                {
                    throw new ApplicationException("User not found.");
                }


                viewModel.ResponseData.PointsBalance = PointsUtils.GetPointsForUser(user.UserID, _context);
                viewModel.ResponseData.UserNumber    = user.UserNumber;
                viewModel.ResponseData.ExternalID    = user.ExternalID;
            }
            catch (Exception ex)
            {
                viewModel.ErrorMessage = ex.Message;
                viewModel.ResponseData = null;
            }

            return(new JsonResult(viewModel));
        }
Пример #4
0
        public IHttpActionResult DeleteComment(Guid id)
        {
            Comment comment = db.Comments.Find(id);

            if (comment == null)
            {
                return(NotFound());
            }
            Guid categoryId = Guid.Empty;

            if (comment.Answer != null)
            {
                categoryId = comment.Answer.Question.CategoryID;
            }
            else if (comment.Question != null)
            {
                categoryId = comment.Question.CategoryID;
            }
            PointsUtils.AddCreditsAndXP(comment.UserID, categoryId, -30, 0);

            db.Comments.Remove(comment);
            db.SaveChanges();

            return(Ok(comment));
        }
        public IHttpActionResult AddScore(ItemScore score)
        {
            Question question   = db.Questions.Find(score.id);
            string   userId     = User.Identity.GetUserId();
            var      scoreitems = question.ScoreItems.Where(x => x.UserID == userId).ToList();

            if (scoreitems.Count == 0)
            {
                int addedScore = Math.Sign(score.score);
                question.ScoreItems.Add(new ScoreItem()
                {
                    Added  = DateTime.Now,
                    Score  = addedScore,
                    UserID = userId,
                    ItemID = question.ID,
                });

                question.Score += addedScore;
            }
            else
            {
                int addedScore = Math.Sign(score.score);
                var scoreItem  = scoreitems.First();
                if (scoreItem.Score != addedScore)
                {
                    question.Score           -= scoreItem.Score;
                    scoreItem.Score           = addedScore;
                    question.Score           += addedScore;
                    db.Entry(scoreItem).State = EntityState.Modified;
                }
                else
                {
                    question.Score           -= scoreItem.Score;
                    db.Entry(scoreItem).State = EntityState.Deleted;
                }
            }
            db.Entry(question).State = EntityState.Modified;
            db.SaveChanges();

            int currentScore       = question.Score;
            int currentBadgeRarity = PointsUtils.getCurrentScoreBadgeRarity(currentScore);

            UserLevel userLevel = question.AspNetUser.UserLevels.Single(x => x.CategoryID == question.CategoryID);
            UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == question.ID);

            if (userBadge == null)
            {
                PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "score", currentBadgeRarity, question.ID);
            }
            else if (userBadge.Badge.Rarity < currentBadgeRarity)
            {
                db.UserBadges.Remove(userBadge);
                PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "score", currentBadgeRarity, question.ID);
            }

            db.SaveChanges();
            return(Ok(new QuestionDTO(question)));
        }
Пример #6
0
        public async Task <IActionResult> LogAction(string AwardNumber, string UserNumber)
        {
            var viewModel = new LogActionJsonViewModel();

            try
            {
                //validate
                var award = await _context.Award.FirstOrDefaultAsync(i => i.AwardNumber == AwardNumber);

                if (award == null)
                {
                    throw new ApplicationException("Award not found.");
                }

                var user = await _context.User.FirstOrDefaultAsync(i => i.UserNumber == UserNumber);

                if (user == null)
                {
                    throw new ApplicationException("User not found.");
                }

                var existingAwardLogByThisUser = await _context.AwardLog.FirstOrDefaultAsync(i =>
                                                                                             i.UserID == user.UserID &&
                                                                                             i.AwardID == award.AwardID);

                if (existingAwardLogByThisUser != null)
                {
                    throw new ApplicationException($"User has already been Awarded points for this action. User has {PointsUtils.GetPointsForUser(user.UserID, _context)} points.");
                }

                //good to go!

                var awardLog = new AwardLog();
                awardLog.AwardID      = award.AwardID;
                awardLog.CreatedDate  = DateTime.UtcNow;
                awardLog.ModifiedDate = awardLog.CreatedDate;
                awardLog.Points       = award.Points;
                awardLog.UserID       = user.UserID;

                _context.Add(awardLog);

                await _context.SaveChangesAsync();

                viewModel.ResponseData.PointsAwarded = awardLog.Points;
                viewModel.ResponseData.PointsBalance = PointsUtils.GetPointsForUser(user.UserID, _context);
                viewModel.ResponseData.UserNumber    = user.UserNumber;
                viewModel.ResponseData.ExternalID    = user.ExternalID;
            } catch (Exception ex)
            {
                viewModel.ErrorMessage = ex.Message;
                viewModel.ResponseData = null;
            }

            return(new JsonResult(viewModel));
        }
        public IHttpActionResult DeleteQuestion(Guid id)
        {
            Question question = db.Questions.Find(id);

            if (question == null)
            {
                return(NotFound());
            }
            PointsUtils.AddCreditsAndXP(question.UserID, question.CategoryID, -100, 0);
            db.Questions.Remove(question);
            db.SaveChanges();

            return(Ok(question));
        }
Пример #8
0
        public IHttpActionResult DeleteAnswer(Guid id)
        {
            Answer answer = db.Answers.Find(id);

            if (answer == null)
            {
                return(NotFound());
            }
            Category category = db.Categories.Single(x => x.ID == answer.Question.CategoryID);

            PointsUtils.AddCreditsAndXP(answer.UserID, category.ID, -50, 0);

            db.Answers.Remove(answer);
            db.SaveChanges();

            return(Ok(answer));
        }
Пример #9
0
        public IHttpActionResult PostComment(Comment comment)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            comment.ID     = Guid.NewGuid();
            comment.Added  = DateTime.Now;
            comment.UserID = User.Identity.GetUserId();

            db.Comments.Add(comment);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if (CommentExists(comment.ID))
                {
                    return(Conflict());
                }
                else
                {
                    throw;
                }
            }
            db      = new OutOfRangeEntities();
            comment = db.Comments.Find(comment.ID);

            Guid categoryId = Guid.Empty;

            if (comment.Answer != null)
            {
                categoryId = comment.Answer.Question.CategoryID;
            }
            else if (comment.Question != null)
            {
                categoryId = comment.Question.CategoryID;
            }

            PointsUtils.AddCreditsAndXP(comment.UserID, categoryId, 4, 7);

            return(CreatedAtRoute("DefaultApi", new { id = comment.ID }, CommentDTO.FromEntity(comment)));
        }
Пример #10
0
        // GET: User/Details/5
        public async Task <IActionResult> Details(int?id)
        {
            var viewModel = new UserDetailsViewModel();

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

            var atendee = await _context.User
                          .SingleOrDefaultAsync(m => m.UserID == id);

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

            viewModel.User          = atendee;
            viewModel.PointsBalance = PointsUtils.GetPointsForUser(atendee.UserID, _context);

            return(View(viewModel));
        }
Пример #11
0
        public IHttpActionResult PostAnswer(Answer answer)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            answer.ID     = Guid.NewGuid();
            answer.Added  = DateTime.Now;
            answer.UserID = User.Identity.GetUserId();

            db.Answers.Add(answer);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if (AnswerExists(answer.ID))
                {
                    return(Conflict());
                }
                else
                {
                    throw;
                }
            }

            db     = new OutOfRangeEntities();
            answer = db.Answers.Find(answer.ID);

            Category category = db.Categories.Single(x => x.ID == answer.Question.CategoryID);

            PointsUtils.AddCreditsAndXP(answer.UserID, category.ID, 10, 15);

            return(CreatedAtRoute("DefaultApi", new { id = answer.ID }, AnswerDTO.FromEntity(answer)));
        }
Пример #12
0
        public IHttpActionResult AddScore(ItemScore score)
        {
            Answer answer     = db.Answers.Find(score.id);
            string userId     = User.Identity.GetUserId();
            var    scoreitems = answer.ScoreItems.Where(x => x.UserID == userId).ToList();

            if (scoreitems.Count == 0)
            {
                int addedScore = Math.Sign(score.score);
                answer.ScoreItems.Add(new ScoreItem()
                {
                    Added  = DateTime.Now,
                    Score  = addedScore,
                    UserID = userId,
                    ItemID = answer.ID,
                });

                answer.Score += addedScore;
            }
            else
            {
                int addedScore = Math.Sign(score.score);
                var scoreItem  = scoreitems.First();
                if (scoreItem.Score != addedScore)
                {
                    answer.Score             -= decimal.ToInt32(scoreItem.Score);
                    scoreItem.Score           = addedScore;
                    answer.Score             += addedScore;
                    db.Entry(scoreItem).State = EntityState.Modified;
                }
                else
                {
                    answer.Score -= addedScore;
                    db.Entry(scoreItem).State = EntityState.Deleted;
                }
            }
            db.Entry(answer).State = EntityState.Modified;
            db.SaveChanges();


            if (answer.Score == 10)
            {
                UserLevel userLevel = answer.AspNetUser.UserLevels.Single(x => x.CategoryID == answer.Question.CategoryID);
                UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == answer.ID);
                if (userBadge == null)
                {
                    PointsUtils.giveBadge(answer.AspNetUser.Id, answer.Question.CategoryID, "score", 0, answer.ID);
                }
            }
            else if (answer.Score == 50)
            {
                UserLevel userLevel = answer.AspNetUser.UserLevels.Single(x => x.CategoryID == answer.Question.CategoryID);
                UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == answer.ID);
                if (userBadge.Badge.Rarity == 0)
                {
                    PointsUtils.giveBadge(answer.AspNetUser.Id, answer.Question.CategoryID, "score", 1, answer.ID);
                    db.UserBadges.Remove(userBadge);
                }
            }
            else if (answer.Score == 100)
            {
                UserLevel userLevel = answer.AspNetUser.UserLevels.Single(x => x.CategoryID == answer.Question.CategoryID);
                UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == answer.ID);
                if (userBadge.Badge.Rarity == 1)
                {
                    PointsUtils.giveBadge(answer.AspNetUser.Id, answer.Question.CategoryID, "score", 2, answer.ID);
                    db.UserBadges.Remove(userBadge);
                }
            }
            else if (answer.Score == 500)
            {
                UserLevel userLevel = answer.AspNetUser.UserLevels.Single(x => x.CategoryID == answer.Question.CategoryID);
                UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == answer.ID);
                if (userBadge.Badge.Rarity == 2)
                {
                    PointsUtils.giveBadge(answer.AspNetUser.Id, answer.Question.CategoryID, "score", 3, answer.ID);
                    db.UserBadges.Remove(userBadge);
                }
            }
            db.SaveChanges();
            return(Ok(new AnswerDTO(answer)));
        }
Пример #13
0
        public async Task <IActionResult> LogAction(string RedemptionNumber, string UserNumber)
        {
            var viewModel = new LogRedemptionJsonViewModel();

            try
            {
                //validate
                var redemption = await _context.Redemption.FirstOrDefaultAsync(i => i.RedemptionNumber == RedemptionNumber);

                if (redemption == null)
                {
                    throw new ApplicationException("Redemption not found.");
                }

                var user = await _context.User.FirstOrDefaultAsync(i => i.UserNumber == UserNumber);

                if (user == null)
                {
                    throw new ApplicationException("User not found.");
                }

                var existingRedemptionByUser = await _context.RedemptionLog.FirstOrDefaultAsync(i =>
                                                                                                i.UserID == user.UserID &&
                                                                                                i.RedemptionID == redemption.RedemptionID);

                if (existingRedemptionByUser != null)
                {
                    throw new ApplicationException($"User has already Redeemed this. User has {PointsUtils.GetPointsForUser(user.UserID, _context)} points.");
                }

                //check if we have enough points
                int  pointsShort     = 0;
                int  userPoints      = PointsUtils.GetPointsForUser(user.UserID, _context);
                int  pointsRequired  = redemption.PointsRequired;
                bool hasEnoughPoints = false;

                pointsShort = pointsRequired - userPoints;

                if (pointsShort <= 0)
                {
                    hasEnoughPoints = true;
                    pointsShort     = 0;
                }



                if (hasEnoughPoints)
                {
                    //good to go!
                    var redemptionLog = new RedemptionLog();
                    redemptionLog.RedemptionID = redemption.RedemptionID;
                    redemptionLog.CreatedDate  = DateTime.UtcNow;
                    redemptionLog.ModifiedDate = redemptionLog.CreatedDate;
                    redemptionLog.UserID       = user.UserID;
                    _context.Add(redemptionLog);
                    await _context.SaveChangesAsync();
                }



                viewModel.ResponseData.PointsShort   = pointsShort;
                viewModel.ResponseData.Success       = hasEnoughPoints;
                viewModel.ResponseData.PointsBalance = PointsUtils.GetPointsForUser(user.UserID, _context);
                viewModel.ResponseData.UserNumber    = user.UserNumber;
                viewModel.ResponseData.ExternalID    = user.ExternalID;
            }
            catch (Exception ex)
            {
                viewModel.ErrorMessage = ex.Message;
                viewModel.ResponseData = null;
            }

            return(new JsonResult(viewModel));
        }
 public void getCurrentBadgeRarityTest4()
 {
     actualRarity   = PointsUtils.getCurrentScoreBadgeRarity(1024);
     expectedRarity = 3;
     Assert.AreEqual(expectedRarity, actualRarity);
 }
        public IHttpActionResult GetQuestion(Guid id)
        {
            Question question = db.Questions.Find(id);

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

            string userId = "";

            if (User.Identity.IsAuthenticated)
            {
                userId = User.Identity.GetUserId();
                var view = question.QuestionViews.Where(x => x.UserID == userId).ToList();
                if (view.Count == 0)
                {
                    question.QuestionViews.Add(new QuestionView()
                    {
                        UserID    = userId,
                        Added     = DateTime.Now,
                        LastVisit = DateTime.Now,
                    });
                    db.Entry(question).State = EntityState.Modified;
                }
                else
                {
                    view.First().LastVisit = DateTime.Now;
                    db.Entry(view.First()).State = EntityState.Modified;
                }
            }

            db.SaveChanges();
            db       = new OutOfRangeEntities();
            question = db.Questions.Find(id);
            QuestionDTO jsonQuestion = new QuestionDTO(question);

            if (User.Identity.IsAuthenticated)
            {
                var qScore = question.ScoreItems.Where(x => x.UserID == userId).ToList();
                if (qScore.Count > 0)
                {
                    var score = qScore.First().Score;
                    jsonQuestion.ScoreGiven = decimal.ToInt32(score);
                }
                foreach (var comment in jsonQuestion.Comments)
                {
                    var comm      = db.Comments.Find(comment.ID);
                    var qComScore = comm.ScoreItems.Where(x => x.UserID == userId).ToList();
                    if (qComScore.Count > 0)
                    {
                        var score = qComScore.First().Score;
                        comment.ScoreGiven = decimal.ToInt32(score);
                    }
                }
                foreach (var answer in jsonQuestion.Answers)
                {
                    var answ       = db.Answers.Find(answer.ID);
                    var qAnswScore = answ.ScoreItems.Where(x => x.UserID == userId).ToList();
                    if (qAnswScore.Count > 0)
                    {
                        var score = qAnswScore.First().Score;
                        answer.ScoreGiven = decimal.ToInt32(score);
                    }
                    foreach (var comment in answer.Comments)
                    {
                        var comm      = db.Comments.Find(comment.ID);
                        var qComScore = comm.ScoreItems.Where(x => x.UserID == userId).ToList();
                        if (qComScore.Count > 0)
                        {
                            var score = qComScore.First().Score;
                            comment.ScoreGiven = decimal.ToInt32(score);
                        }
                    }
                }
            }
            int viewsNumber = question.QuestionViews.Count();

            if (viewsNumber == 100)
            {
                PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "views", 0, question.ID);
            }
            else if (viewsNumber == 300)
            {
                PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "views", 1, question.ID);
            }
            else if (viewsNumber == 500)
            {
                PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "views", 2, question.ID);
            }
            else if (viewsNumber == 1000)
            {
                PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "views", 3, question.ID);
            }

            return(Ok(jsonQuestion));
        }
        public IHttpActionResult PostQuestion(Question question)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            string     userId = User.Identity.GetUserId();
            AspNetUser user   = db.AspNetUsers.Single(x => x.Id == userId);

            if (question.Bounty > user.Credits && question.Bounty > 0)
            {
                return(BadRequest("Cannot add a bounty with more points than you have"));
            }
            user.Credits        -= question.Bounty;
            db.Entry(user).State = EntityState.Modified;
            List <Tag> removingTags = new List <Tag>();
            List <Tag> addingTags   = new List <Tag>();

            foreach (var tag in question.Tags)
            {
                var currentTag = db.Tags.SingleOrDefault(x => x.Name.ToLower() == tag.Name.ToLower());
                if (currentTag == null)
                {
                    tag.ID = Guid.NewGuid();

                    //Tag newTag = new Tag()
                    //{
                    //    Name = tag.Name.ToLower(),
                    //    Description = tag.Description,
                    //    ID = Guid.NewGuid()
                    //};
                    //db.Tags.Add(newTag);
                }
                else
                {
                    removingTags.Add(tag);
                    addingTags.Add(currentTag);
                }
            }

            foreach (var removingTag in removingTags)
            {
                question.Tags.Remove(removingTag);
            }

            foreach (var addingTag in addingTags)
            {
                question.Tags.Add(addingTag);
            }



            question.ID = Guid.NewGuid();

            //guid hardcodat al unui user
            if (User.Identity.IsAuthenticated)
            {
                question.UserID = userId;
            }
            else
            {
                question.UserID = "9e03ab56-d1c8-460a-ad48-fa7c6e69bf18";
            }

            question.Added    = DateTime.Now;
            question.Modified = DateTime.Now;
            //Category ca sa mearga (bine ca nu's puse FK inca)
            db.Questions.Add(question);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                if (QuestionExists(question.ID))
                {
                    return(Conflict());
                }
                else
                {
                    throw e;
                }
            }
            PointsUtils.AddCreditsAndXP(userId, question.CategoryID, 10, 15);

            int questionsNumber = user.Questions.Where(x => x.CategoryID == question.CategoryID).Count();
            int badgeRarity     = PointsUtils.getQuestionBadgeRarity(questionsNumber);

            if (badgeRarity != -1)
            {
                PointsUtils.giveBadge(userId, question.CategoryID, "question", badgeRarity, question.ID);
            }

            db       = new OutOfRangeEntities();
            question = db.Questions.Find(question.ID);
            return(CreatedAtRoute("DefaultApi", new { id = question.ID }, QuestionDTO.FromEntity(question)));
        }
Пример #17
0
 public decimal GetPoints(ClassificationInfo classificationInfo, Result result, int tableIndex)
 {
     return(PointsUtils.GetPlacePoints(classificationInfo, result.Rank, tableIndex));
 }
 public void getQuestionBadgeRarityTest5()
 {
     actualRarity   = PointsUtils.getQuestionBadgeRarity(500);
     expectedRarity = 3;
     Assert.AreEqual(expectedRarity, actualRarity);
 }