/// <summary>
        /// Зберігає дані виписки в базі даних
        /// </summary>
        /// <param name="account">Рахунок користувача для якої взята виписка</param>
        /// <param name="statementItems">Дані виписки</param>
        /// <returns>[Дані збережено / не збережено] [Повідомлення]</returns>
        public static async Task <(bool isSaved, string message)> SaveAsync(string account, List <StatementItem> statementItems)
        {
            try
            {
                var dbContext = new MonoboardDbContext();

                var databaseData = dbContext.StatementItems.Select(item => item.Id).ToList();

                if (statementItems.Count == 0)
                {
                    return(true, "MbDataMonthNotExist");
                }

                foreach (var item in statementItems.Where(item => !databaseData.Exists(s => s == item.Id)))
                {
                    item.CardKey = account;
                    await dbContext.StatementItems.AddAsync(item);
                }

                return(await dbContext.SaveChangesAsync() > 0
                                        ? (true, "MbSaveDataSuccess")
                                        : (false, "MbDataAlreadyDownloaded"));
            }
            catch (Exception exception)
            {
                return(false, exception.Message);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Отримуємо дані конкретного користувача
        /// </summary>
        /// <param name="clientId">ID користувача</param>
        /// <param name="isGetAccounts">
        /// [Стан] Завантажувати / не завантажувати дані
        /// про картки/рахунки клієнта</param>
        /// <param name="isGetUserSettings">
        /// [Стан] Завантажувати / не завантажувати дані
        /// про особисті налаштування клієнта</param>
        /// <returns>Дані конкретного користувача</returns>
        public static async Task <UserInfo> GetUserAsync(
            string clientId,
            bool isGetAccounts     = false,
            bool isGetUserSettings = false)
        {
            var db = new MonoboardDbContext();

            var user = await db.UserInfo.Where(info => info.ClientId == clientId)
                       .Select(user => user).SingleAsync();

            if (isGetAccounts)
            {
                var accounts = await db.Accounts.Where(account => account.ClientId == clientId).ToListAsync();

                user.Accounts = accounts;
            }

            if (isGetUserSettings)
            {
                var monoboardUsers = await db.MonoBoardUsers.Where(account => account.ClientId == clientId).SingleAsync();

                user.MonoboardUser = monoboardUsers;
            }

            return(user);
        }
Beispiel #3
0
        /// <summary>
        /// Знаходимо останню дату (місяць) дані якої не було завантажено
        /// </summary>
        /// <param name="cardCode">Код картки рахунку</param>
        /// <returns>Дата (місяць), яка не має жодних завантажених даних</returns>
        public static async Task <DateTime> GetLastDate(string cardCode)
        {
            await using var db = new MonoboardDbContext();

            var currentDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 0, 0, 0);

            var lastDate = await db.StatementItemsCheckers.SingleOrDefaultAsync(checker => checker.CardCode == cardCode && checker.IsEnd);

            var items = db.StatementItemsCheckers
                        .Where(checker => checker.CardCode == cardCode)
                        .Select(checker => checker.Month)
                        .OrderByDescending(time => time.Date);

            var monthoffset = -1;

            foreach (var dateTime in items)
            {
                if (lastDate?.Month.Date == dateTime.Date)
                {
                    return(lastDate.Month.Date);
                }

                if (dateTime.Date == currentDate.Date.AddMonths(monthoffset))
                {
                    monthoffset--;
                }
                else
                {
                    return(currentDate.Date.AddMonths(monthoffset));
                }
            }

            return(currentDate.Date.AddMonths(monthoffset));
        }
Beispiel #4
0
        /// <summary>
        /// Отримуємо список користувачів
        /// </summary>
        /// <param name="isCustomDataNeeds">
        /// [Стан] Вказує чи додавати / не додавати
        /// специфічні дані користувача до списку</param>
        /// <param name="isAccountNeeds">
        /// [Стан] Вказує чи додавати / не додавати
        /// перелік рахунків користувача
        /// </param>
        /// <returns>Список користувачів Monoboard</returns>
        public static ObservableCollection <UserInfo> GetUserList(
            bool isCustomDataNeeds = false,
            bool isAccountNeeds    = false)
        {
            var dbContext = new MonoboardDbContext();
            var userInfo  = dbContext.UserInfo.AsParallel();

            if (isAccountNeeds)
            {
                foreach (var user in userInfo)
                {
                    user.Accounts = dbContext.Accounts.AsParallel()
                                    .Where(account => account.AccountKey == user.Id).ToList();
                }
            }

            if (isCustomDataNeeds)
            {
                foreach (var user in userInfo)
                {
                    user.MonoboardUser = dbContext.MonoBoardUsers
                                         .First(userdata => userdata.ClientId == user.ClientId);
                }
            }

            return(new ObservableCollection <UserInfo>(userInfo));
        }
Beispiel #5
0
        /// <summary>
        /// Оновлює дані користувача в базі даних застосунку
        /// </summary>
        /// <param name="userInfo">Інформація про користувача</param>
        /// <returns>[Стан] Створення нового користувача пройшло успішно / не успішно</returns>
        public static async Task <bool> UpdateUserAsync(UserInfo userInfo)
        {
            await using var db = new MonoboardDbContext();

            db.UserInfo.Update(userInfo);

            return(await db.SaveChangesAsync() > 0);
        }
Beispiel #6
0
        /// <summary>
        /// Створює нового користувача в базі даних застосунку
        /// </summary>
        /// <param name="userInfo">Інформація про користувача</param>
        /// <returns>[Стан] Створення нового користувача пройшло успішно / не успішно</returns>
        public static async Task <bool> SetNewUserAsync(UserInfo userInfo)
        {
            await using var db = new MonoboardDbContext();

            await db.UserInfo.AddAsync(userInfo);

            return(await db.SaveChangesAsync() > 0);
        }
Beispiel #7
0
        /// <summary>
        /// Завантажує нові дані щодо партнерів базі даних застосунку
        /// </summary>
        /// <param name="partners">Інформація про партнерів</param>
        /// <returns>[Стан] Збереження виконано / Виникла помилка</returns>
        public static async Task <bool> SaveAsync(List <Partner> partners)
        {
            await using var db = new MonoboardDbContext();

            await db.Partners.AddRangeAsync(partners);

            return(await db.SaveChangesAsync() > 0);
        }
Beispiel #8
0
        /// <summary>
        /// Видаляє користувача з бази даних і всю інформацію пов'язану з ним
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <returns>[Стан] Видалення користувача пройшло успішно / не успішно</returns>
        public static async Task <bool> DeleteUserDataAsync(string clientId)
        {
            await using var db = new MonoboardDbContext();

            db.UserInfo.Remove(await db.UserInfo.SingleAsync(user => user.ClientId == clientId));

            return(await db.SaveChangesAsync() > 0);
        }
Beispiel #9
0
        /// <summary>
        /// Визначає, чи були завантажені дані за цей місяць раніше
        /// </summary>
        /// <param name="cardCode">Код картки рахунку</param>
        /// <param name="currentDate">Вибрана дата</param>
        /// <returns>Дані за цей місяць присутні / відсутні</returns>
        public static async Task <bool> CheckAsync(string cardCode, DateTime currentDate)
        {
            await using var db = new MonoboardDbContext();

            var itemsChecker = db.StatementItemsCheckers
                               .Where(checker => checker.CardCode == cardCode)
                               .Select(checker => checker.Month);

            return(itemsChecker.Contains(currentDate));
        }
Beispiel #10
0
        /// <summary>
        /// Видаляє всі дані про партнерів Монобанку
        /// </summary>
        /// <returns>[Стан] Видалено успішно / Виникла помилка</returns>
        public static async Task <bool> DeleteAsync()
        {
            await using var db = new MonoboardDbContext();

            if (db.Partners.Any() is false)
            {
                return(true);
            }

            db.Partners.RemoveRange(db.Partners);
            return(await db.SaveChangesAsync() > 0);
        }
Beispiel #11
0
        /// <summary>
        /// Визначає тему додатку за бажанням користувача
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <param name="isDarkTheme">[Стан] Світла тема / Темна тема</param>
        /// <returns>[Стан] Тему змінено / не змінено</returns>
        public static async Task <bool> UpdateTheme(string clientId, bool isDarkTheme)
        {
            await using var db = new MonoboardDbContext();

            var user = await db.MonoBoardUsers.FirstAsync(monoboardUser => monoboardUser.ClientId == clientId);

            user.IsDarkTheme = isDarkTheme;

            db.MonoBoardUsers.Update(user);

            return(await db.SaveChangesAsync() != 0);
        }
Beispiel #12
0
        /// <summary>
        /// Змінюємо токен доступу користувача
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <param name="token">Токен користувача</param>
        /// <returns>[Стан] Токен змінено / не змінено</returns>
        public static async Task <bool> ChangeAccessTokenAsync(string clientId, string token)
        {
            await using var db = new MonoboardDbContext();

            var user = await db.MonoBoardUsers.FirstAsync(monoboardUser => monoboardUser.ClientId == clientId);

            user.AccessToken = token;

            db.MonoBoardUsers.Update(user);

            return(await db.SaveChangesAsync() > 0);
        }
Beispiel #13
0
        /// <summary>
        /// Зберігає мову користувача
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <param name="language">Вибрана мова</param>
        /// <returns>[Стан] Мову змінено / не змінено</returns>
        public static async Task <bool> UpdateLanguage(string clientId, string language)
        {
            await using var db = new MonoboardDbContext();

            var user = await db.MonoBoardUsers.FirstAsync(monoboardUser => monoboardUser.ClientId == clientId);

            user.Language = language;

            db.MonoBoardUsers.Update(user);

            return(await db.SaveChangesAsync() != 0);
        }
        /// <summary>
        /// Зберігає інформацію про те, що дані за вказаний місяць завантажені
        /// </summary>
        /// <param name="cardCode">Код картки рахунку користувача</param>
        /// <param name="month">Вибрана дата (місяць)</param>
        /// <param name="isEnd">Вказує, чи це є кінцевою точкою виписки</param>
        /// <returns>[Стан] Дані збережено / не збережено</returns>
        public static async Task <bool> CheckSaveAsync(string cardCode, DateTime month, bool isEnd)
        {
            await using var db = new MonoboardDbContext();

            await db.StatementItemsCheckers.AddAsync(new StatementItemsChecker
            {
                CardCode = cardCode,
                Month    = month,
                IsEnd    = isEnd
            });

            return(await db.SaveChangesAsync() != 0);
        }
Beispiel #15
0
        /// <summary>
        /// Записує захешований пароль користувача в базу даних
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <param name="password">Захешований пароль користувача</param>
        /// <returns>[Стан] Пароль встановлено / не встановлено</returns>
        public static async Task <bool> SetNewPassword(string clientId, string password)
        {
            await using var db = new MonoboardDbContext();

            var user = await db.MonoBoardUsers.FirstAsync(monoboardUser => monoboardUser.ClientId == clientId);

            user.Password        = password;
            user.IsPasswordReset = false;

            db.MonoBoardUsers.Update(user);

            return(await db.SaveChangesAsync() > 0);
        }
Beispiel #16
0
        /// <summary>
        /// Встановлює значення теми і кольорів за замовчуванням
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <returns>[Стан] Значення за замовчуванням встановлено / не встановлено</returns>
        public static async Task <bool> ResetColorTheme(string clientId)
        {
            await using var db = new MonoboardDbContext();

            var user = await db.MonoBoardUsers.FirstAsync(monoboardUser => monoboardUser.ClientId == clientId);

            user.IsDarkTheme    = false;
            user.PrimaryColor   = "fff43b3f";
            user.SecondaryColor = "ff06b206";

            db.MonoBoardUsers.Update(user);

            return(await db.SaveChangesAsync() != 0);
        }
Beispiel #17
0
        /// <summary>
        /// Вказує, що вся виписка картки/рахунку користувача вже завантажена
        /// [Поточний місяць не рахується]
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <param name="cardCode">Ідентифікатор рахунку</param>
        /// <returns>[Стан] Позначує, що виписка завантажена / виникла помилка</returns>
        public static async Task <bool> SetStatementsDownloadedAsync(
            string clientId,
            string cardCode)
        {
            await using var db = new MonoboardDbContext();

            var account = await db.Accounts.FirstAsync(accounts => accounts.ClientId == clientId && accounts.CardCode == cardCode);

            account.IsDownloaded = true;

            db.Accounts.Update(account);

            return(await db.SaveChangesAsync() != 0);
        }
Beispiel #18
0
        /// <summary>
        /// Визначає первинний колір додатку за бажанням користувача
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <param name="primaryColor">Основний колір додатку</param>
        /// <returns>[Стан] Основний колір змінено / не змінено</returns>
        public static async Task <bool> UpdatePrimaryColor(string clientId, string primaryColor)
        {
            await using var db = new MonoboardDbContext();

            var user = await db.MonoBoardUsers.FirstAsync(monoboardUser => monoboardUser.ClientId == clientId);

            user.PrimaryColor = primaryColor.Contains("#") ?
                                primaryColor :
                                $"#{primaryColor}";

            db.MonoBoardUsers.Update(user);

            return(await db.SaveChangesAsync() != 0);
        }
Beispiel #19
0
        /// <summary>
        /// Отримає список партнерів з інформацією про них
        /// </summary>
        /// <returns>Інформація про партнерів Monobank</returns>
        public static async Task <List <Partner> > GetListAsync()
        {
            var db = new MonoboardDbContext();

            var partners = await db.Partners
                           .Select(partner => partner)
                           .ToListAsync();

            foreach (var partner in partners)
            {
                partner.Categories = await db.PartnersCategories
                                     .Where(category => category.PartnerKey == partner.Id)
                                     .ToListAsync();
            }

            return(partners);
        }
Beispiel #20
0
        /// <summary>
        /// Скидання паролю користувача
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <returns>[Стан] Пароль скинуто / не скинуто та згенерований пароль для користувача</returns>
        public static async Task <(bool isResetCompleted, string newPassword)> ResetPasswordAsync(string clientId)
        {
            await using var db = new MonoboardDbContext();

            var user = await db.MonoBoardUsers.FirstAsync(monoboardUser => monoboardUser.ClientId == clientId);

            var newPassword = Sha256Hash.Compute($"user{user.ClientId}!");

            bool isComplete;

            if (user.Password != newPassword)
            {
                user.Password        = newPassword;
                user.IsPasswordReset = true;

                isComplete = await db.SaveChangesAsync() > 0;
            }
            else
            {
                isComplete = true;
            }

            return(isComplete, $"user{user.MonoboardUserKey}{user.ClientId}!");
        }
Beispiel #21
0
        /// <summary>
        /// Встановлює введені дані картки/рахунку користувача
        /// </summary>
        /// <param name="clientId">Id клієнта Monobank</param>
        /// <param name="cardCode">Ідентифікатор рахунку</param>
        /// <param name="cardName">Змінена назва картки/рахунку користувача</param>
        /// <param name="cardDescription">Змінений опис картки/рахунку користувача</param>
        /// <returns></returns>
        public static async Task <bool> SetCardPersonalizationAsync(
            string clientId,
            string cardCode,
            string cardName,
            string cardDescription)
        {
            await using var db = new MonoboardDbContext();

            var account = await db.Accounts.FirstAsync(accounts => accounts.ClientId == clientId && accounts.CardCode == cardCode);

            if (string.IsNullOrWhiteSpace(cardName) is false)
            {
                account.CustomCardName = cardName;
            }

            if (string.IsNullOrWhiteSpace(cardDescription) is false)
            {
                account.CustomCardDescription = cardDescription;
            }

            db.Accounts.Update(account);

            return(await db.SaveChangesAsync() != 0);
        }
Beispiel #22
0
        /// <summary>
        /// Зберігає дані курсів валют в базі даних
        /// </summary>
        /// <param name="exchangeRates">Дані курсу валют</param>
        /// <returns>[Стан] Дані збережено / не збережено</returns>
        public static async Task <bool> Save(List <ExchangeRates> exchangeRates)
        {
            var dbContext = new MonoboardDbContext();

            if (await dbContext.ExchangeRates.AnyAsync())
            {
                var dbExchangeRates = await dbContext.ExchangeRates
                                      .Select(exchangesData => exchangesData)
                                      .OrderByDescending(exchangesData => exchangesData.ExchangeRatesId)
                                      .Take(114)
                                      .OrderByDescending(exchangesData => exchangesData.CurrencyCodeA)
                                      .ToListAsync();

                for (var index = 0; index < exchangeRates.Count; index++)
                {
                    var dbRateCross = dbExchangeRates[index];

                    var rateCross = exchangeRates.Single(rates =>
                                                         rates.CurrencyCodeA == dbRateCross.CurrencyCodeA &&
                                                         rates.CurrencyCodeB == dbRateCross.CurrencyCodeB);

                    if (UnixConverter.UnixTimestampToDateTime(dbRateCross.Date)
                        .ToShortDateString() ==
                        UnixConverter.UnixTimestampToDateTime(rateCross.Date)
                        .ToShortDateString())
                    {
                        if (dbRateCross.RateBuy != rateCross.RateBuy)
                        {
                            dbRateCross.RateBuy = float.Parse(rateCross.RateBuy.ToString("F4"));
                        }

                        if (dbRateCross.RateSell != rateCross.RateSell)
                        {
                            dbRateCross.RateSell = float.Parse(rateCross.RateSell.ToString("F4"));
                        }

                        if (dbRateCross.RateCross.HasValue && rateCross.RateCross.HasValue)
                        {
                            if (dbRateCross.RateCross != rateCross.RateCross)
                            {
                                dbRateCross.RateCross = float.Parse(rateCross.RateCross !.Value.ToString("F4"));
                            }
                        }

                        dbRateCross.Date = rateCross.Date;

                        dbContext.ExchangeRates.Update(dbRateCross);
                    }
                    else
                    {
                        rateCross.RateBuy  = float.Parse(rateCross.RateBuy.ToString("F4"));
                        rateCross.RateSell = float.Parse(rateCross.RateSell.ToString("F4"));

                        if (dbRateCross.RateCross.HasValue && rateCross.RateCross.HasValue)
                        {
                            rateCross.RateCross = float.Parse(rateCross.RateCross.Value.ToString("F4"));
                        }

                        await dbContext.ExchangeRates.AddAsync(rateCross);
                    }
                }

                return(await dbContext.SaveChangesAsync() > 0);
            }

            foreach (var rates in exchangeRates)
            {
                rates.RateBuy  = float.Parse(rates.RateBuy.ToString("F4"));
                rates.RateSell = float.Parse(rates.RateSell.ToString("F4"));

                if (rates.RateCross.HasValue)
                {
                    rates.RateCross = float.Parse(rates.RateCross.Value.ToString("F4"));
                }
            }

            await dbContext.ExchangeRates.AddRangeAsync(exchangeRates);

            return(await dbContext.SaveChangesAsync() > 0);
        }
Beispiel #23
0
        /// <summary>
        /// Перевіряємо наявність користувача в базі даних по токену
        /// </summary>
        /// <param name="token">Токен користувача</param>
        /// <returns>[Стан] Користувач в базі даних наявний / відсутній</returns>
        public static async Task <bool> GetUserExistByToken(string token)
        {
            var users = new MonoboardDbContext().MonoBoardUsers;

            return(await users.AnyAsync() && await users.AnyAsync(user => user.AccessToken == token));
        }