public async Task <ActionResult> FlagQuestion(int questionId)
        {
            var user = await _userManager.FindByNameAsync(User.Identity.Name);

            if (user == null)
            {
                return(Unauthorized());
            }

            var flag = await _context.FlaggedQuestions.Where(x => x.UserId == user.Id && x.QuestionId == questionId).FirstOrDefaultAsync();

            if (flag != null)
            {
                return(BadRequest("Question has already been flagged by the user."));
            }

            if (await _context.Questions.Where(q => q.ID == questionId && q.UserID == user.Id.ToString()).CountAsync() > 0)
            {
                return(BadRequest("You can't report your own question."));
            }

            var flaggedQuestion = new FlaggedQuestion
            {
                UserId     = user.Id.ToString(),
                QuestionId = questionId,
            };

            _context.FlaggedQuestions.Add(flaggedQuestion);
            await _context.SaveChangesAsync();

            return(NoContent());
        }
Exemplo n.º 2
0
        public async Task <ActionResult> EndorseAnswer(int answerId)
        {
            var user = await _userManager.FindByNameAsync(User.Identity.Name);

            if (user == null)
            {
                return(Unauthorized());
            }

            var endorsement = await _context.EndorsedAnswers.Where(x => x.UserId == user.Id && x.AnswerId == answerId).FirstOrDefaultAsync();

            if (endorsement != null)
            {
                return(BadRequest("Answer has already been endorsed by the user."));
            }

            var endorsedAnswer = new EndorsedAnswer
            {
                UserId   = user.Id.ToString(),
                AnswerId = answerId,
            };

            _context.EndorsedAnswers.Add(endorsedAnswer);
            await _context.SaveChangesAsync();

            return(NoContent());
        }
        public async Task <IActionResult> PutSubject(int id, SubjectViewModel subjectViewModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var user = await userManager.FindByNameAsync(User.Identity.Name);

            if (user == null)
            {
                return(Unauthorized());
            }

            if (id != subjectViewModel.ID)
            {
                return(BadRequest());
            }
            if (await _context.Subjects.Where(s => s.SubjectName.ToLower() == subjectViewModel.SubjectName.ToLower() && s.ID != id).CountAsync() > 0)
            {
                return(BadRequest("Subject name is already in use."));
            }

            var subject = await _context.Subjects.FindAsync(id);

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

            subject.SubjectName = subjectViewModel.SubjectName;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!SubjectExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
        public async Task <IActionResult> PutAnswer(int id, AnswerViewModel answerViewModel)
        {
            var user = await userManager.FindByNameAsync(User.Identity.Name);

            if (user == null)
            {
                return(Unauthorized());
            }

            if (id != answerViewModel.ID)
            {
                return(BadRequest());
            }

            var answer = await _context.Answers.FindAsync(id);

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

            answer.AnswerContent = answerViewModel.AnswerContent;
            answer.QuestionID    = answerViewModel.QuestionID;
            answer.UserID        = user.Id;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!AnswerExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
        public async Task <IActionResult> PutQuestion(int id, QuestionViewModel questionViewModel)
        {
            var user = await userManager.FindByNameAsync(User.Identity.Name);

            if (user == null)
            {
                return(Unauthorized());
            }

            if (id != questionViewModel.ID)
            {
                return(BadRequest());
            }

            var question = await _context.Questions.FindAsync(id);

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

            question.Title       = questionViewModel.Title;
            question.Description = questionViewModel.Description;
            question.UserID      = user.Id;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!QuestionExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
        public async Task <ActionResult <UserViewModel> > PutUser(string id, UserViewModel userViewModel)
        {
            var user = await _userManager.FindByIdAsync(id);

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

            await _userManager.RemoveFromRolesAsync(user, new List <string>() { "User", "Expert", "Admin", "Banned" });

            user.UserName = userViewModel.Username;
            user.Email    = userViewModel.Email;

            await _userManager.AddToRoleAsync(user, userViewModel.Role);

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException ex)
            {
                throw ex;
            }

            return(NoContent());
        }
Exemplo n.º 7
0
        public async Task <IActionResult> Login([FromBody] LoginModel model)
        {
            var user = await userManager.FindByEmailAsync(model.Email);

            if (user != null && await userManager.CheckPasswordAsync(user, model.Password))
            {
                var userRoles = await userManager.GetRolesAsync(user);

                var authClaims = new List <Claim>
                {
                    new Claim("unique_name", user.UserName),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                };

                foreach (var userRole in userRoles)
                {
                    authClaims.Add(new Claim(ClaimTypes.Role, userRole));
                }

                var authSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:Secret"]));

                var token = new JwtSecurityToken(
                    issuer: _configuration["JWT:ValidIssuer"],
                    audience: _configuration["JWT:ValidAudience"],
                    expires: DateTime.Now.AddHours(3),
                    claims: authClaims,
                    signingCredentials: new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256)
                    );

                user.LastLoggedIn = DateTime.Now;

                await _context.SaveChangesAsync();

                return(Ok(new
                {
                    id = user.Id,
                    email = user.Email,
                    role = userRoles[0],
                    token = new JwtSecurityTokenHandler().WriteToken(token),
                    expiration = token.ValidTo
                }));
            }
            return(Unauthorized());
        }
Exemplo n.º 8
0
        public async Task <IActionResult> PostQuestionVote(QuestionVoteViewModel model)
        {
            var user = await userManager.FindByNameAsync(User.Identity.Name);

            if (user == null)
            {
                return(Unauthorized());
            }

            var question = await _context.Questions.Where(x => x.ID == model.QuestionId).FirstOrDefaultAsync();

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

            var vote = await _context.QuestionVotes.Where(x => x.UserId == user.Id && x.QuestionId == model.QuestionId).FirstOrDefaultAsync();

            if (vote != null)
            {
                return(BadRequest("Question has already been voted on."));
            }

            var questionVote = new QuestionVote
            {
                QuestionId = model.QuestionId,
                UserId     = user.Id,
                Vote       = model.Vote
            };

            _context.QuestionVotes.Add(questionVote);

            if (model.Vote == 1)
            {
                question.Upvotes += 1;
            }
            else
            {
                question.Downvotes += 1;
            }

            await _context.SaveChangesAsync();

            return(NoContent());
        }
        public async Task <ActionResult <ApplicationViewModel> > PostApplication(ApplicationViewModel applicationViewModel)
        {
            var user = await _userManager.FindByNameAsync(User.Identity.Name);

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

            var subject = await _context.Subjects.Where(x => x.SubjectName == applicationViewModel.SubjectName).FirstOrDefaultAsync();

            if (subject == null)
            {
                return(NotFound("Subject not found"));
            }

            var application = new ExpertApplication
            {
                Motivation      = applicationViewModel.Motivation,
                DateTimeCreated = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm")),
                SubjectId       = subject.ID,
                UserId          = user.Id,
            };

            //Checks if the user has an pending application for the subject he is applying in

            List <ExpertApplication> expertApplications = await _context.ExpertApplications.Where(x => x.UserId == user.Id).ToListAsync();

            if (expertApplications.Count != 0)
            {
                foreach (var userApplication in expertApplications)
                {
                    if (userApplication.SubjectId == application.SubjectId && userApplication.Status == ApplicationStatus.Pending)
                    {
                        return(StatusCode(400, "You already have an active request for this subject!"));
                    }
                    if (userApplication.SubjectId == application.SubjectId && userApplication.ReviewedBy != null)
                    {
                        int  value      = DateTime.Compare(userApplication.ReviewedOn.AddMinutes(2), DateTime.Now);
                        bool TimePassed = value != 1;
                        if (TimePassed == false)
                        {
                            return(StatusCode(400, "Your last request was to recent. you can apply 2 minutes after your last request has been denied."));
                        }

                        if (TimePassed && userApplication.SubjectId == application.SubjectId && userApplication.Status == ApplicationStatus.Denied)
                        {
                            userApplication.Status     = ApplicationStatus.Pending;
                            userApplication.ReviewedBy = null;
                            await _context.SaveChangesAsync();

                            return(StatusCode(200, "Your application for " + applicationViewModel.SubjectName + " has been set to Pending"));
                        }
                        return(StatusCode(400, "You have applied for this subject already or have been approved!"));
                    }
                }
            }

            _context.ExpertApplications.Add(application);
            await _context.SaveChangesAsync();

            return(StatusCode(200, "Your application for " + applicationViewModel.SubjectName + " has been submitted"));
        }