public async Task <DbStatus> Add(LocalAccount localAccount)
        {
            List <string>   commandsToExecute = new List <string>();
            IConnector      connector         = ConnectorFactory.CreateConnector();
            MySqlConnection connection        = connector.CreateConnection();
            await connector.OpenConnection(connection);

            LocalAccount currentAccount = await GetByUniqueIdentifiers(new string[] { "Email" }, localAccount);

            if (currentAccount != null && currentAccount.Deleted == 0)
            {
                return(DbStatus.EXISTS);
            }
            else if (currentAccount != null && currentAccount.Deleted == 1)
            {
                DeleteOrUpdateRoles(currentAccount, localAccount, commandsToExecute, connection);

                commandsToExecute.Add(new InsertOrUpdateCommand <LocalAccount>().GetCommand(connection, localAccount.GetAssociatedDbTableName(), localAccount).CommandText);
            }
            else
            {
                commandsToExecute.Add(new InsertCommand <LocalAccount>().GetCommand(connection, localAccount.GetAssociatedDbTableName(), localAccount).CommandText);
                foreach (var role in localAccount.GetRoles())
                {
                    LocalAccountRole lr = new LocalAccountRole()
                    {
                        IdRole = role.IdRole
                    };
                    commandsToExecute.Add(new InsertIntoConnectionTableCommand <LocalAccountRole>("IdLocalAccount").GetCommand(connection, lr.GetAssociatedDbTableName(), lr).CommandText);
                }
            }
            DbTransactionProcedure transactionProcedure = new UpdateDbTransactionProcedure(commandsToExecute.ToArray());
            DbStatus status = await transactionProcedure.Execute();

            return(status);
        }
        public async Task <DbStatus> Delete(LocalAccount localAccount)
        {
            List <string>   commandsToExecute = new List <string>();
            IConnector      connector         = ConnectorFactory.CreateConnector();
            MySqlConnection connection        = connector.CreateConnection();
            await connector.OpenConnection(connection);

            foreach (var role in localAccount.GetRoles())
            {
                LocalAccountRole lr = new LocalAccountRole()
                {
                    IdLocalAccount = localAccount.IdLocalAccount,
                    IdRole         = role.IdRole
                };
                commandsToExecute.Add(new DeleteCommand <LocalAccountRole>().GetCommand(connection, lr.GetAssociatedDbTableName(), lr).CommandText);
            }
            commandsToExecute.Add(new DeleteCommand <LocalAccount>().GetCommand(connection, localAccount.GetAssociatedDbTableName(), localAccount).CommandText);
            DbTransactionProcedure transactionProcedure = new DeleteDbTransactionProcedure(commandsToExecute.ToArray());
            DbStatus status = await transactionProcedure.Execute();

            return(status);
        }
        private void DeleteOrUpdateRoles(LocalAccount currentAccount, LocalAccount localAccount, List <string> commandsToExecute, MySqlConnection connection)
        {
            var rolesToDelete = currentAccount.GetRoles().Except(localAccount.GetRoles());
            var rolesToAdd    = localAccount.GetRoles().Except(currentAccount.GetRoles());

            foreach (var role in rolesToDelete)
            {
                LocalAccountRole lr = new LocalAccountRole()
                {
                    IdLocalAccount = currentAccount.IdLocalAccount,
                    IdRole         = role.IdRole
                };
                commandsToExecute.Add(new DeleteCommand <LocalAccountRole>().GetCommand(connection, lr.GetAssociatedDbTableName(), lr).CommandText);
            }
            foreach (var role in rolesToAdd)
            {
                LocalAccountRole lr = new LocalAccountRole()
                {
                    IdRole         = role.IdRole,
                    IdLocalAccount = currentAccount.IdLocalAccount,
                    Deleted        = 0
                };
                commandsToExecute.Add(new InsertOrUpdateCommand <LocalAccountRole>().GetCommand(connection, lr.GetAssociatedDbTableName(), lr).CommandText);
            }
        }