135 lines
4.5 KiB
C#
135 lines
4.5 KiB
C#
// все про пользователей
|
||
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<string> 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<IActionResult> GetUsers()
|
||
{
|
||
// беру людей и их роли
|
||
var users = await _context.Users
|
||
.Include(u => u.Role)
|
||
.ToListAsync();
|
||
|
||
return Ok(users);
|
||
}
|
||
|
||
// добавить человека
|
||
[HttpPost]
|
||
public async Task<IActionResult> 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<IActionResult> 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<IActionResult> DeleteUser(int id)
|
||
{
|
||
var user = await _context.Users.FindAsync(id); // ищу
|
||
|
||
if (user == null)
|
||
return NotFound();
|
||
|
||
_context.Users.Remove(user); // удаляю
|
||
await _context.SaveChangesAsync(); // сохраняю
|
||
|
||
return NoContent();
|
||
}
|
||
}
|