bykovme/nswallet

View on GitHub
src/NSWallet/NSWallet.Shared/Business/BusinessLayer.cs

Summary

Maintainability
D
2 days
Test Coverage
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NSWallet.Shared.Helpers.Logs.AppLog;
using NSWallet.Shared.Helpers.Logs.DeviceInfo;

namespace NSWallet.Shared
{
    public static partial class BL
    {
        static string lang;
        static string lastCurrentID;
        public static string CurrentFieldID { get; private set; }
        public static string CurrentItemID { get; private set; }


        public static void InitAPI(string dbFileName, string language)
        {
            DataAccessLayer.Init(dbFileName);
            lang = language;
            CurrentItemID = GConsts.ROOTID;
        }

        public static bool PrepareDiagnostics()
        {
            var dal = DataAccessLayer.GetInstance();
            return dal.PrepareDiagnostics();
        }

        public static bool IsDiagnosticsRunning()
        {
            var dal = DataAccessLayer.GetInstance();
            return dal.IsDiagnosticsRunning();
        }

        public static async Task<bool> RunDiagnostics(string path, LogsDeviceInfo logsDeviceInfo, bool fromLogin)
        {
            var dal = DataAccessLayer.GetInstance();
            return await dal.RunDiagnostics(path, logsDeviceInfo, fromLogin);
        }

        public static void SetCurrentFieldID(string id)
        {
            CurrentFieldID = id;
        }

        public static void ClearCurrentFieldID()
        {
            CurrentFieldID = null;
        }

        public static void SetExpirationSettings(bool addExpiryFolder, int expPeriod) {
            ExpiringSoon = addExpiryFolder;
            DataAccessLayer.GetInstance().ExpiryDate = DateTime.Now + TimeSpan.FromDays(expPeriod);
        }

        public static void SetRecentlyViewSetting(bool addRecentSetting) {
            RecentlyViewed = addRecentSetting;
        }

        public static void SetMostlyViewSetting(bool addMostSetting)
        {
            MostlyViewed = addMostSetting;
        }

        public static string GetFieldTypeNameByShortName(string fieldTypeShortName)
        {
            switch (fieldTypeShortName) {
                case GConsts.FLDTYPE_ACNT:
                    return TR.Tr("ACNT");
                case GConsts.FLDTYPE_ADDR:
                    return TR.Tr("ADDR");
                case GConsts.FLDTYPE_CARD:
                    return TR.Tr("CARD");
                case GConsts.FLDTYPE_DATE:
                    return TR.Tr("DATE");
                case GConsts.FLDTYPE_EXPD:
                    return TR.Tr("EXPD");
                case GConsts.FLDTYPE_LINK:
                    return TR.Tr("LINK");
                case GConsts.FLDTYPE_MAIL:
                    return TR.Tr("MAIL");
                case GConsts.FLDTYPE_NAME:
                    return TR.Tr("NAME");
                case GConsts.FLDTYPE_NOTE:
                    return TR.Tr("NOTE");
                case GConsts.FLDTYPE_OLDP:
                    return TR.Tr("OLDP");
                case GConsts.FLDTYPE_PASS:
                    return TR.Tr("PASS");
                case GConsts.FLDTYPE_PHON:
                    return TR.Tr("PHON");
                case GConsts.FLDTYPE_PINC:
                    return TR.Tr("PINC");
                case GConsts.FLDTYPE_SANS:
                    return TR.Tr("SANS");
                case GConsts.FLDTYPE_SNUM:
                    return TR.Tr("SNUM");
                case GConsts.FLDTYPE_SQUE:
                    return TR.Tr("SQUE");
                case GConsts.FLDTYPE_TIME:
                    return TR.Tr("TIME");
                case GConsts.FLDTYPE_USER:
                    return TR.Tr("USER");
                default:
                    return fieldTypeShortName;
            }
        }

        public static string GetCurrentPath()
        {
            if (CurrentItemID == GConsts.EXPIRING_SOON_ID)
            {
                return "/" + TR.Tr("expiringsoon_folder") + "/";
            }

            if (lastCurrentID == GConsts.EXPIRING_SOON_ID)
            {
                return "/" + TR.Tr("expiringsoon_folder") + "/" + GetCurrentItem().Name + "/";
            }

            if (CurrentItemID == GConsts.RECENTLY_VIEWED_FOLDER_ID)
            {
                return "/" + TR.Tr("recentlyviewed_folder") + "/";
            }

            if (lastCurrentID == GConsts.RECENTLY_VIEWED_FOLDER_ID)
            {
                return "/" + TR.Tr("recentlyviewed_folder") + "/" + GetCurrentItem().Name + "/";
            }

            if (CurrentItemID == GConsts.MOSTLY_VIEWED_ID)
            {
                return "/" + TR.Tr("mostlyviewed_folder") + "/";
            }

            if (lastCurrentID == GConsts.MOSTLY_VIEWED_ID)
            {
                return "/" + TR.Tr("mostlyviewed_folder") + "/" + GetCurrentItem().Name + "/";
            }

            if (bufferedPath.ContainsKey(CurrentItemID))
            {
                return bufferedPath[CurrentItemID];
            }
            bufferedPath.Add(CurrentItemID, GetRecursivePath(CurrentItemID, ""));
            return bufferedPath[CurrentItemID];

        }

        static void ClearPathBuffer()
        {
            bufferedPath?.Clear();
        }

        static Dictionary<string, string> bufferedPath = new Dictionary<string, string>();
        public static string GetRecursivePath(string itemID, string constructedPath)
        {
            if (itemID == GConsts.ROOTID)
            {
                return "/" + constructedPath;
            }
            return GetRecursivePath(DataAccessLayer.GetInstance().GetParentIDByItemID(itemID),
                                    DataAccessLayer.GetInstance().GetItemByID(itemID).Name + "/" + constructedPath);
        }

        public static bool IsNew()
        {
            var dal = DataAccessLayer.GetInstance();
            if (!dal.ArePropsSet || !dal.SearchForRoot())
            {
                return true;
            }
            return false;
        }

        public static bool ExpiringSoon { get; private set; }
        public static bool RecentlyViewed { get; private set; }
        public static bool MostlyViewed { get; private set; }

        public static void Close()
        {
            DataAccessLayer.Close();
        }

        public static void InitNewStorage()
        {
            var dal = DataAccessLayer.GetInstance();

            if (dal.ArePropsSet == false)
            {
                dal.SetNewProperties(lang);

            }
            AddSystemLabels();
            CreateIconGroups();
            UpgradeManager.Upgrade();
        }

        public static bool AddColumnsToTablesUpgrade03()
        {
            var dal = DataAccessLayer.GetInstance();
            return dal.AddColumnsToTablesUpgrade03();
        }

        public static void CreateSampleItems()
        {
            var dal = DataAccessLayer.GetInstance();

            // Banking
            var folderBankingID = Common.GenerateUniqueString(GConsts.ITEMID_LENGTH);
            dal.CreateItem(folderBankingID, GConsts.ROOTID, TR.Tr("init_items_banking"), "folderbanking", true);

            var visaID = Common.GenerateUniqueString(GConsts.ITEMID_LENGTH);
            dal.CreateItem(visaID, folderBankingID, TR.Tr("init_items_credit_card_sample"), "visa", false);

            var creditNumberID = Common.GenerateUniqueString(GConsts.FIELDID_LENGTH);
            dal.CreateField(visaID, creditNumberID, GConsts.FLDTYPE_CARD, "1234 5678 0987 6543", 100);

            // Internet
            var folderInternetID = Common.GenerateUniqueString(GConsts.ITEMID_LENGTH);
            dal.CreateItem(folderInternetID, GConsts.ROOTID, TR.Tr("init_items_internet"), "folderinternet", true);

            // Internet - Support
            var supportID = Common.GenerateUniqueString(GConsts.ITEMID_LENGTH);
            dal.CreateItem(supportID, folderInternetID, TR.Tr("init_items_support"), "heart", false);

            var emailSupID = Common.GenerateUniqueString(GConsts.FIELDID_LENGTH);
            dal.CreateField(supportID, emailSupID, GConsts.FLDTYPE_MAIL, "support@nyxbull.com", 100);

            var webSupID = Common.GenerateUniqueString(GConsts.FIELDID_LENGTH);
            dal.CreateField(supportID, webSupID, GConsts.FLDTYPE_LINK, @"www.nyxbull.com/support", 200);

            // Internet - Facebook
            var facebookID = Common.GenerateUniqueString(GConsts.ITEMID_LENGTH);
            dal.CreateItem(facebookID, folderInternetID, TR.Tr("init_items_facebook"), "facebook", false);

            var webFacebookID = Common.GenerateUniqueString(GConsts.FIELDID_LENGTH);
            dal.CreateField(facebookID, webFacebookID, GConsts.FLDTYPE_LINK, @"www.facebook.com/nswallet", 100);

            // Internet - Twitter
            var twitterID = Common.GenerateUniqueString(GConsts.ITEMID_LENGTH);
            dal.CreateItem(twitterID, folderInternetID, TR.Tr("init_items_twitter"), "twitter", false);

            var webTwitterID = Common.GenerateUniqueString(GConsts.FIELDID_LENGTH);
            dal.CreateField(twitterID, webTwitterID, GConsts.FLDTYPE_LINK, @"www.twitter.com/nyxbullsoft", 100);

            // Read me
            var readmeID = Common.GenerateUniqueString(GConsts.ITEMID_LENGTH);
            dal.CreateItem(readmeID, GConsts.ROOTID, TR.Tr("init_items_readme"), "document", false);

            var readmeNoteID = Common.GenerateUniqueString(GConsts.FIELDID_LENGTH);
            dal.CreateField(readmeID, readmeNoteID, GConsts.FLDTYPE_NOTE, TR.Tr("init_items_readme_text"), 100);
        }

        public static void CreateIconGroups()
        {
            initGroup("category_internet");
            initGroup("category_travelling");
            initGroup("category_finances");
            initGroup("category_technologies");
            initGroup("category_common");
            initGroup("category_social");
            initGroup("category_development");
            initGroup("category_clouds");
            initGroup("category_games");
        }

        static void initGroup(string category)
        {
            var groups = GetGroups();
            var groupExists = groups.Exists(x => string.Compare(x.Name, category) == 0);
            if (!groupExists) {
                int groupID = 0;
                if (groups.Count > 0) {
                    groupID = groups.Max(x => x.GroupID) + 1;
                }
                InsertGroup(groupID, category);
            }
        }

        public static NSWProperties StorageProperties
        {
            get
            {
                var dal = DataAccessLayer.GetInstance();
                return dal.StorageProperties;
            }
        }




        public static void SetDBVersion(string version)
        {
            var dal = DataAccessLayer.GetInstance();
            dal.SetDBVersion(version);
        }

        public static int CountSearchPhrase(string searchPhrase)
        {
            return searchPhrase.Length;
        }

        public static List<NSWItem> Search(string searchPhrase)
        {
            if (SM.CheckPhraseLength(searchPhrase, GConsts.SEARCH_MIN_LENGTH))
            {
                var searchResult = new List<NSWItem>();
                searchPhrase = SM.ConvertToLower(searchPhrase);
                var dal = DataAccessLayer.GetInstance();
                var items = dal.Items;

                var searchItems = items.FindAll(x => SM.ConvertToLower(x.Name).Contains(searchPhrase) && !x.Folder);
                if (searchItems != null)
                    if (searchItems.Count > 0)
                        searchResult.AddRange(searchItems);
                var searchFields = items.FindAll(x => x.Fields != null && x.Fields.Exists(y => SM.ConvertToLower(y.FieldValue).Contains(searchPhrase)));
                if (searchFields != null)
                    if (searchFields.Count > 0)
                        searchResult.AddRange(searchFields);
                
                if (searchResult.Count > 0)
                    return searchResult.Distinct().ToList();
                return null;
            }

            return null;
        }

        public static List<NSWIcon> GetIcons()
        {
            return DataAccessLayer.GetInstance().Icons;
        }

        public static List<NSWGroup> GetGroups()
        {
            return DataAccessLayer.GetInstance().Groups;
        }

        public static bool InsertIcon(byte[] iconBLOB, int groupID, string iconID = null, string name = null)
        {
            if (iconID == null) {
                iconID = Common.GenerateUniqueString(GConsts.ICONID_LENGTH);
            }
            if (name == null) {
                name = iconID;
            }
            var dal = DataAccessLayer.GetInstance();
            ResetData(false, false, false, true);
            return dal.InsertIcon(iconID, name, iconBLOB, groupID);
        }

        public static bool DeleteIcon(string iconID)
        {
            if (iconID != null) {
                var dal = DataAccessLayer.GetInstance();
                ResetData(false, false, false, true);
                return dal.DeleteIcon(iconID);
            }
            return false;
        }

        public static bool InsertGroup(int groupID, string name)
        {
            var dal = DataAccessLayer.GetInstance();
            var result = dal.InsertGroup(groupID, name);
            ResetData(false, false, false, false, true);
            return result;
        }

        public static bool UpdateGroup(int groupID, string name)
        {
            var dal = DataAccessLayer.GetInstance();
            var res = dal.UpdateGroup(groupID, name);
            ResetData(false, false, false, false, true);
            return res;
        }

        /// <summary>
        /// Updates the icon.
        /// </summary>
        /// <returns><c>true</c>, if icon was updated, <c>false</c> otherwise.</returns>
        /// <param name="iconID">Icon identifier.</param>
        /// <param name="name">Name.</param>
        /// <param name="blob">BLOB.</param>
        /// <param name="groupID">Group identifier.</param>
        /// <param name="isCircle">Is circle: 0 - <see langword="false"/>, 1 - <see langword="true"/>.</param>
        public static bool UpdateIcon(string iconID, string name, byte[] blob = null, int groupID = -1, int isCircle = -1)
        {
            var dal = DataAccessLayer.GetInstance();
            var res = dal.UpdateIcon(iconID, name, blob, groupID, isCircle);
            ResetData(false, false, false, true, false);
            return res;
        }



        public static bool CheckPassword(string password)
        {
            return DataAccessLayer.GetInstance().CheckPassword(password);
        }

        public static string GetDbID()
        {
            return DataAccessLayer.GetInstance().StorageProperties.DatabaseID;
        }

        public static List<NSWItem> GetAllItems()
        {
            var dal = DataAccessLayer.GetInstance();
            return dal.Items;
        }

        public static List<NSWItem> GetCurrentItems()
        {
            return GetListByParentID(CurrentItemID, false);
        }


        public static bool SearchForRoot()
        {
            return DataAccessLayer.GetInstance().SearchForRoot();
        }

        public static void CreateOnlyRootItem(string newPassword)
        {
            if (newPassword == GConsts.DEMO_PASSWORD) {
                // Special logic to be used for testing purposes only 
                DataAccessLayer.RestoreDemoDatabase(); 
                if (CheckPassword(GConsts.TEST_PASSWORD) == false) {
                    throw new Exception("Error restoring Demo database");
                }
                return;
            }
            DataAccessLayer.GetInstance().CreateOnlyRootItem(newPassword);
        }

        public static void ResetData(bool resetItems, bool resetFields, bool resetLabels, bool icons = false, bool groups = false)
        {
            bufferedPath.Clear();
            expiringItems = null;
            DataAccessLayer.GetInstance().ResetMemoryData(resetItems, resetFields, resetLabels, icons, groups);
        }

        public static bool ChangePassword(string newPassword)
        {
            return DataAccessLayer.GetInstance().ChangePassword(newPassword);
        }

        public static bool CheckDBVersion(string filename) {
            Int32 currentDBVersion = 0;
            Int32 backupVersion;

            try {
                currentDBVersion = Convert.ToInt32(GConsts.DB_VERSION);
                backupVersion = Convert.ToInt32(NSWalletDBCheck.GetDBVersion(filename));
            } catch(Exception ex) {
                backupVersion = -1;
                log(ex.Message, nameof(CheckDBVersion));
            }
            if (backupVersion <= 0) return false;
            if (backupVersion > currentDBVersion) return false;
            return true;
        }

        static void log(string message, string method = null)
        {
            AppLogs.Log(message, method, nameof(BL));
        }
    }
}