// вход и регистрация using DEMO.Data; // база using DEMO.Models; // пользователи using Microsoft.AspNetCore.Mvc; // контроллер using Microsoft.EntityFrameworkCore; // поиск в базе namespace DEMO.Controllers; [ApiController] // это api [Route("api/[controller]")] // адрес будет api/auth public class AuthController : ControllerBase { private readonly AppDbContext _context; // база // запоминаю базу public AuthController(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; // точка не сразу и не в конце } // войти, адрес POST api/auth/login [HttpPost("login")] public async Task Login(User user) // приходят логин и пароль { // ищу такого человека в базе var existingUser = await _context.Users .Include(u => u.Role) // сразу беру его роль .FirstOrDefaultAsync(u => u.Login == user.Login && u.Password == user.Password); // не нашел значит неправильный пароль if (existingUser == null) return Unauthorized("Неверный логин или пароль."); // нашел, отдаю его обратно return Ok(new { existingUser.Id, existingUser.Login, existingUser.Email, Role = existingUser.Role?.Name }); } // регистрация, адрес POST api/auth/register [HttpPost("register")] public async Task Register(User user) // приходят логин пароль и почта { // чищу пробелы user.Login = (user.Login ?? "").Trim(); user.Email = (user.Email ?? "").Trim(); // проверки по порядку, чтоб человек понял что не так if (user.Login.Length < 2) return BadRequest("Логин слишком короткий, надо минимум 2 буквы."); if (user.Password == null || user.Password.Length < 8) return BadRequest("Пароль слишком короткий, надо минимум 8 символов."); if (!IsEmailOk(user.Email)) return BadRequest("Почта неправильная, проверьте ее."); // проверяю нет ли уже такого логина var loginExists = await _context.Users .AnyAsync(u => u.Login == user.Login); if (loginExists) return BadRequest("Такой логин уже занят."); // проверяю не занята ли почта var emailExists = await _context.Users .AnyAsync(u => u.Email == user.Email); if (emailExists) return BadRequest("Такая почта уже зарегистрирована."); // ищу роль клиент чтоб дать ее новичку var clientRole = await _context.Roles .FirstOrDefaultAsync(r => r.Name == "Client"); if (clientRole == null) return BadRequest("Роль Client не найдена."); user.RoleId = clientRole.Id; // даю роль клиент _context.Users.Add(user); // добавляю в базу await _context.SaveChangesAsync(); // сохраняю // отдаю нового человека return Ok(new { user.Id, user.Login, user.Email, Role = clientRole.Name }); } }