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()); }
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()); }
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()); }
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")); }