/// <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); } }
/// <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); }
/// <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)); }
/// <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)); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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}!"); }
/// <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); }
/// <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); }
/// <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)); }