/// <summary> /// Получить данные из кэша. /// </summary> /// <param name="login">Поиск по логину</param> /// <returns>Данные из кэша</returns> internal new ADLoginsDB this[string login] { get{ if (login.IndexOf('\\') == -1) { throw new ArgumentException($"Неверный формат логина AD. Логин должен быть вида: \"domain\\login\". Передан логин \"{login}\""); } login = login.Substring(login.IndexOf('\\') + 1); lock (Locker) { if (_ADLogins.Keys.Contains(login)) { UpdateDataInDB(login); } else { using (IDBSource dbSource = new MKKContext()) { ADLoginsDB adLoginsIDB = dbSource.ADLoginsDBs.AsNoTracking().FirstOrDefault(i => i.Login.Equals(login)); if (adLoginsIDB == default) { AddDataToDB(dbSource, login); } else { UpdateCacheFromDB(dbSource, adLoginsIDB, login); } } } return((ADLoginsDB)_ADLogins[login]); } } }
/// <summary> /// Обновить кэш. /// </summary> /// <param name="dbSource">БД</param> /// <param name="adLoginsIDB">Логин в БД</param> /// <param name="login">Логин пользователя</param> private void UpdateCacheFromDB(IDBSource dbSource, ADLoginsDB adLoginsIDB, string login) { _ADLogins.TryAdd(login, adLoginsIDB); _ADLogins[login].Name = GetNameByLogin(login); _ADLogins[login].UpdateDate = DateTime.Now; dbSource.SaveChanges(); }
/// <summary> /// Добавить в БД новую запись пользователя. /// </summary> /// <param name="dBSource">БД</param> /// <param name="login">Логин пользователя</param> private void AddDataToDB(IDBSource dBSource, string login) { ADLoginsDB adLoginsIDB = new ADLoginsDB() { Login = login, Name = GetNameByLogin(login), UpdateDate = DateTime.Now }; dBSource.ADLoginsDBs.Add(adLoginsIDB); dBSource.SaveChanges(); _ADLogins.TryAdd(login, adLoginsIDB); }
/// <summary> /// Установить проверяющего асинхронно. /// </summary> /// <param name="account1CCode">Номер договора 1С</param> /// <param name="login">Логин проверяющего</param> /// <param name="assignDate">Дата операции</param> /// <param name="timeZone">Часовой пояс проверяющего</param> /// <param name="cancellationToken">Токен отмены</param> public async Task SetInspectionAsync(string account1CCode, string login, DateTime assignDate, int timeZone, CancellationToken cancellationToken) { SetInspectionCheckParams(login, assignDate, timeZone); using (IDBSource dbSource = new MKKContext()) { Account1C account1C = await FindAccountAndLogErrorAsync <EFServiceInspecting>(account1CCode, cancellationToken); ADLoginsDB adLogin = Singleton <ProxyADLoginsDB> .Values[login]; await dbSource.AccountInspectingDB.AddAsync( new AccountInspectingDB() { Account1CID = account1C.Account1CCode, OperationDate = assignDate, TimeZone = timeZone, UserPermission = PermissionLevel.GetInt(login), ADLoginsDBID = adLogin.ID }, cancellationToken); await dbSource.SaveChangesAndLogErrorAsync <EFServiceInspecting>(cancellationToken); } }
/// <summary> /// Получить все сообщения по договору асинхронно. /// </summary> /// <param name="adLogin">Логин пользователя AD</param> /// <param name="account1CCode">Номер договора 1С</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns>Все сообщения по договору</returns> public async Task <Post[]> GetPostsAsync(string adLogin, string account1CCode, CancellationToken cancellationToken) { GetPostsCheckParams(adLogin, account1CCode); ADLoginsDB author = Singleton <ProxyADLoginsDB> .Values[adLogin]; Account1C account = await FindAccountAndLogErrorAsync <EFServicePosts>(account1CCode, cancellationToken, i => i.Client); if (account == default) { return(new Post[0]); } Task <List <PostsDB> > postsInAccountTask = GetPostsInAccountAsync(account, cancellationToken); Task <List <PostsDB> > postsByClientTask = GetPostsByClientAsync(account, cancellationToken); List <PostsDB> posts = (await postsByClientTask).Where(i => i.Author.ID.Equals(author.ID) || CanReadAllPost(adLogin)).ToList(); posts.AddRange((await postsInAccountTask).Where(i => i.Author.ID.Equals(author.ID) || CanReadAllPost(adLogin)).ToArray()); Post[] result = posts.Select(i => (Post)i).ToArray(); return(result); }