DemO/DEMO/Controllers/AuthController.cs

116 lines
4.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// вход и регистрация
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<IActionResult> 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<IActionResult> 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
});
}
}