DemO/DEMO/Controllers/UsersController.cs

135 lines
4.5 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/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();
}
}