You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SAE-2.01/MCTG/Managers/UserDefaultManager.cs

150 lines
4.5 KiB

using AppException;
using Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Managers
{
public class UserDefaultManager : IUserManager, INotifyPropertyChanging
{
private IDataManager _dataManager;
private IPasswordManager _passwordManager;
private User? _currentConnected = null;
public UserDefaultManager(IDataManager dataManager, IPasswordManager passwordManager)
{
_dataManager = dataManager;
_passwordManager = passwordManager;
}
public User? CurrentConnected
{
get => _currentConnected;
private set
{
_currentConnected = value;
OnPropertyChanged();
}
}
public IPasswordManager PasswordManager => _passwordManager;
public event PropertyChangingEventHandler? PropertyChanging;
public void OnPropertyChanged([CallerMemberName] string pname = "")
=> PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(pname));
public bool AddUserToData(User user)
{
var userList = _dataManager.Data[nameof(User)];
if (userList.Exists(r => r.Equals(user)))
return false;
_dataManager.Data[nameof(User)].Add(user);
return true;
}
public User CreateUser(string mail, string password,
string? name = null, string? surname = null, string? profilePict = null)
{
if (name is null) name = $"user{GetRandomInt()}";
if (surname is null) surname = "";
if (profilePict is null) profilePict = "default_user_picture.png";
const string mailRegex = @"^([\w\.-]+)@([\w\.-]+\.\w+)$";
if (!Regex.Match(mail, mailRegex).Success)
throw new BadMailFormatException();
string hashedPassword = PasswordManager.HashPassword(password);
return new User(name, surname, mail, hashedPassword, profilePict);
}
public ICollection<User> GetAllUsers()
{
return _dataManager.GetFromData<User>();
}
public User GetUserFromMail(string mail)
{
User? user = _dataManager.GetFromData<User>().ToList()
.Find(u => u.Mail == mail);
if (user is null)
throw new UserNotFoundException();
return user;
}
public bool LogIn(string mail, string password)
{
if (CurrentConnected is not null)
throw new UserAlreadyConnectedException();
#if DEBUG
if (mail == "admin")
{
CurrentConnected = _dataManager.GetFromData<User>()
.FirstOrDefault(u => u.Mail == "admin@mctg.fr");
return true;
}
#endif
User? user = _dataManager.GetFromData<User>().ToList()
.Find(u => u.Mail == mail);
if (user is null)
return false;
if (!_passwordManager.VerifyPassword(user.Password, password))
return false;
CurrentConnected = user;
return true;
}
public void LogOut()
{
if (CurrentConnected is null)
throw new NoUserConnectedException();
CurrentConnected = null;
}
public bool ModifyCurrentConnected(User newUser)
{
try
{
var index = _dataManager.GetFromData<User>().ToList()
.FindIndex(u => u.Equals(_currentConnected));
_dataManager.Data[nameof(User)][index] = newUser;
}
catch (ArgumentNullException e)
{
Debug.WriteLine("User to modify not found.");
return false;
}
return true;
}
private int GetRandomInt()
{
var randomGenerator = RandomNumberGenerator.Create();
byte[] data = new byte[16];
randomGenerator.GetBytes(data);
return Math.Abs(BitConverter.ToInt16(data));
}
}
}