/// <summary>
 /// Delete attribute of base item before base item is deleted
 /// </summary>
 /// <param name="item">Base item about to be deleted</param>
 public void OnItemDelete(Item item)
 {
     if (item.HasData <AccountData>())
     {
         var data = item.GetData <AccountData>();
         AccountDataRepo.Delete(data);
     }
 }
 /// <summary>
 /// Create attribute, if present, after item is created
 /// </summary>
 /// <param name="item">Base item just created from datastore</param>
 public void OnItemCreate(Item item)
 {
     if (item.HasData <AccountData>())
     {
         var data = item.GetData <AccountData>();
         data.DataItemId = item.Id;
         AccountDataRepo.Create(data);
     }
 }
        /// <summary>
        /// Authenticate a user name and password
        /// </summary>
        /// <param name="email"></param>
        /// <param name="password"></param>
        /// <returns>User account if authenticated, otherwise null</returns>
        public AccountData Authenticate(string email, string password)
        {
            var authenRequest = new AuthenticationRequest()
            {
                PrincipalName     = email,
                PrincipalPassword = password
            };
            var account = AccountDataRepo.Read(authenRequest);

            return(account);
        }
        /// <summary>
        /// Append attribute to base item when it is loaded
        /// </summary>
        /// <param name="item">Base item just read from datastore</param>
        public void OnItemRead(Item item)
        {
            var characterManager = ModuleManager.GetManager <IAccountCharacterManager>();
            var characterData    = characterManager.ReadByCharacter(item.Id);

            if (characterData != null)
            {
                var accountData = AccountDataRepo.Read(characterData.AccountId);
//                accountData.Password = null;
                item.Data.Add(accountData);
            }
        }
        /// <summary>
        /// Delete an account and all associated account characters
        /// </summary>
        /// <param name="accountId"></param>
        public void Delete(Guid accountId)
        {
            var accountCharacterDatas = ModuleManager.GetManager <IAccountCharacterManager>()
                                        .ReadByAccount(accountId);
            var accountCharacterItemIds = accountCharacterDatas.Select(x => x.CharacterItemId).ToList();

            if (accountCharacterItemIds.Count > 0)
            {
                ModuleManager.GetManager <IAccountCharacterManager>().Delete(accountCharacterItemIds);
            }
            var accountData = AccountDataRepo.Read(accountId);

            AccountDataRepo.Delete(accountData);
        }
        /// <summary>
        /// Create a new account
        /// </summary>
        /// <param name="name">Login name</param>
        /// <param name="password">Login password</param>
        /// <param name="temporary">Account is temporary for trial purposes</param>
        /// <param name="admin">Account has administrative rights</param>
        public AccountData Create(
            string name,
            string password,
            bool temporary = false,
            bool admin     = false)
        {
            var account = AccountDataRepo.Create(new List <AccountData>()
            {
                new AccountData()
                {
                    Name      = name,
                    Password  = BCrypt.Net.BCrypt.HashPassword(password),
                    Temporary = temporary,
                    Admin     = admin
                }
            }).FirstOrDefault();

            return(account);
        }
 /// <summary>
 /// Append attribute to base item when it is loaded
 /// </summary>
 /// <param name="item">Base item about to be persisted to datastore</param>
 public void OnItemUpdate(Item item)
 {
     if (item.HasData <AccountData>())
     {
         var data = item.GetData <AccountData>();
         if (data.Id == Guid.Empty)
         {
             OnItemCreate(item);
         }
         else
         {
             AccountDataRepo.Update(data);
         }
     }
     //else if (AccountDataRepo.Read(item) is AccountData data)
     //{
     //    AccountDataRepo.Delete(data);
     //}
 }
 /// <summary>
 /// Update existing account
 /// </summary>
 /// <param name="accountData">AccountData containing updated properties</param>
 /// <returns></returns>
 public AccountData Update(AccountData accountData)
 {
     accountData.Password = BCrypt.Net.BCrypt.HashPassword(accountData.Password);
     AccountDataRepo.Update(accountData);
     return(accountData);
 }