public async Task <IActionResult> PutAsync([FromRoute] long id, [FromBody] PutStudentViewModel putStudent) { if (!ModelState.IsValid) { return(new ObjectResult(new ApiDataResult { Error = PutUserResultType.Wrong, Data = new { ModelState } }) { StatusCode = StatusCodes.Status422UnprocessableEntity }); } if (id != putStudent.Id) { return(BadRequest(new ApiResult { Error = PutUserResultType.Wrong })); } var result = await _userService.PutStudentAsync(putStudent); switch (result.Error) { case PutUserResultType.Forbiddance: return(new ObjectResult(result) { StatusCode = StatusCodes.Status403Forbidden }); case PutUserResultType.ConcurrencyException: return(BadRequest(result)); case PutUserResultType.UserNotFound: return(NotFound(result)); case PutUserResultType.Repeat: return(BadRequest(result)); case PutUserResultType.Wrong: return(new ObjectResult(result) { StatusCode = StatusCodes.Status422UnprocessableEntity }); case PutUserResultType.Error: return(BadRequest(result)); case PutUserResultType.Ok: return(Ok(result)); default: throw new ArgumentOutOfRangeException(); } }
public async Task <ApiResult> PutStudentAsync(PutStudentViewModel putStudent) { var user = await _context.Users.Include(u => u.Role).SingleOrDefaultAsync(u => u.Id == putStudent.Id); if (user == null) { return new PutUserResult { Error = PutUserResultType.UserNotFound } } ; var count = (await _context.Enrollments.Where(e => e.StudentId == long.Parse(user.LoginName)).ToListAsync()) .Count; if (count > 0) { return(new PutStudentResult { Error = PutUserResultType.Forbiddance }); } if (putStudent.Password != null) { putStudent.Password = GetRandomPassword(); user.PasswordHash = _passwordHasher.HashPassword(user, putStudent.Password); } else { if (user.LoginName != putStudent.LoginName) { var uu = await _context.Users.SingleOrDefaultAsync(u => u.LoginName == putStudent.LoginName); if (uu != null) { return(new PutStudentResult { Error = PutUserResultType.Repeat }); } } user.LoginName = putStudent.LoginName; user.UserName = putStudent.UserName; var student = await _context.Students.FindAsync(long.Parse(user.LoginName)); student.Group = putStudent.Group; _context.Entry(student).State = EntityState.Modified; } _context.Entry(user).State = EntityState.Modified; try { await _context.SaveChangesAsync(); return(new PutStudentResult { Error = PutUserResultType.Ok, Data = putStudent }); } catch (DbUpdateConcurrencyException) { return(new PutStudentResult { Error = PutUserResultType.ConcurrencyException }); } }