// все про пользователей using DEMO.Data; // база using DEMO.Models; // пользователи using Microsoft.AspNetCore.Mvc; // контроллер using Microsoft.EntityFrameworkCore; // база namespace DEMO.Controllers; [ApiController] // это api [Route("api/[controller]")] // адрес будет api/users public class UsersController : ControllerBase { private readonly AppDbContext _context; // база // запоминаю базу public UsersController(AppDbContext context) { _context = context; } // простая проверка почты: есть @ и точка после нее private static bool IsEmailOk(string email) { if (string.IsNullOrWhiteSpace(email)) return false; // пустая не годится int at = email.IndexOf('@'); // ищу собаку if (at < 1) return false; // @ нет или стоит первой int dot = email.IndexOf('.', at); // ищу точку после @ return dot > at + 1 && dot < email.Length - 1; // точка не сразу и не в конце } // проверяю человека перед сохранением, возвращаю текст ошибки или пусто private async Task CheckUser(User user, int skipId) { user.Login = (user.Login ?? "").Trim(); // убираю пробелы user.Email = (user.Email ?? "").Trim(); if (user.Login.Length < 2) return "Логин слишком короткий, надо минимум 2 буквы."; if (user.Password == null || user.Password.Length < 8) return "Пароль слишком короткий, надо минимум 8 символов."; if (!IsEmailOk(user.Email)) return "Почта неправильная, проверьте ее."; // логин должен быть только у одного (себя не считаю) bool loginBusy = await _context.Users .AnyAsync(u => u.Login == user.Login && u.Id != skipId); if (loginBusy) return "Такой логин уже занят."; // почта тоже только у одного bool emailBusy = await _context.Users .AnyAsync(u => u.Email == user.Email && u.Id != skipId); if (emailBusy) return "Такая почта уже зарегистрирована."; return ""; // все хорошо } // отдать всех людей [HttpGet] public async Task GetUsers() { // беру людей и их роли var users = await _context.Users .Include(u => u.Role) .ToListAsync(); return Ok(users); } // добавить человека [HttpPost] public async Task CreateUser(User user) // приходит логин пароль почта роль { string error = await CheckUser(user, 0); // проверяю, 0 значит нового if (error != "") return BadRequest(error); // что-то не так, говорю что _context.Users.Add(user); // добавляю await _context.SaveChangesAsync(); // сохраняю return Ok(user); } // изменить человека [HttpPut("{id}")] public async Task UpdateUser(int id, User user) { var existingUser = await _context.Users.FindAsync(id); // ищу старого if (existingUser == null) return NotFound(); string error = await CheckUser(user, id); // проверяю, себя пропускаю if (error != "") return BadRequest(error); // меняю поля existingUser.Login = user.Login; existingUser.Password = user.Password; existingUser.Email = user.Email; existingUser.RoleId = user.RoleId; await _context.SaveChangesAsync(); // сохраняю return Ok(existingUser); } // удалить человека [HttpDelete("{id}")] public async Task DeleteUser(int id) { var user = await _context.Users.FindAsync(id); // ищу if (user == null) return NotFound(); _context.Users.Remove(user); // удаляю await _context.SaveChangesAsync(); // сохраняю return NoContent(); } }