Exemple #1
0
        public UserGroup UpdateUserGroup(UserGroup userGroupForUpdate, User owner)
        {
            //Аутентификация пользователя-владельца
            AuthenticateUser(owner);

            //Проверка - иммеет ли право владелец добавлять или изменять данные
            this.ChechIsAdmin(owner, typeof(UserGroup));


            //Создание экземпляра контекста
            using (CFAPContext ctx = new CFAPContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;

                try
                {
                    ctx.Entry(userGroupForUpdate).State = EntityState.Modified;
                    ctx.SaveChanges(DbConcurencyUpdateOptions.ClientPriority);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }


            return(userGroupForUpdate);
        }
Exemple #2
0
        public Rate AddRate(Rate newRate, User user)
        {
            AuthenticateUser(user);

            this.ChechIsAdmin(user, typeof(Rate));

            using (CFAPContext ctx = new CFAPContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;
                try
                {
                    ctx.Rates.Add(newRate);
                    newRate.CustomValidate(ctx);
                    ctx.SaveChanges(DbConcurencyUpdateOptions.ClientPriority);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }

            return(newRate);
        }
Exemple #3
0
        public BudgetItem AddBudgetItem(BudgetItem newBudgetItem, User user)
        {
            AuthenticateUser(user);

            this.ChechIsAdmin(user, typeof(BudgetItem));

            using (CFAPContext ctx = new CFAPContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;
                try
                {
                    ctx.BudgetItems.Add(newBudgetItem);
                    ctx.SaveChanges(DbConcurencyUpdateOptions.ClientPriority);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }

            return(newBudgetItem);
        }
Exemple #4
0
        public UserGroup AddNewUserGroup(UserGroup newUserGroup, User owner)
        {
            AuthenticateUser(owner);

            this.ChechIsAdmin(owner, typeof(UserGroup));


            using (CFAPContext ctx = new CFAPContext())
            {
                try
                {
                    ctx.UserGroups.Add(newUserGroup);
                    ctx.SaveChanges(DbConcurencyUpdateOptions.ClientPriority);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }

            return(newUserGroup);
        }
Exemple #5
0
        public ICrudOperations Update(DbConcurencyUpdateOptions concurencyUpdateOptions, User user)
        {
            if (user.IsAdmin == false)
            {
                throw new FaultException <NoRightsToChangeDataException>(new NoRightsToChangeDataException(user, this.GetType().Name));
            }

            concurencyUpdateOptions = DbConcurencyUpdateOptions.ClientPriority;

            Period result = null;

            try
            {
                using (CFAPContext ctx = new CFAPContext())
                {
                    ctx.Configuration.ProxyCreationEnabled = false;
                    ctx.Periods.Attach(this);
                    ctx.Entry(this).State = System.Data.Entity.EntityState.Modified;
                    ctx.SaveChanges(concurencyUpdateOptions);
                    result = (from p in ctx.Periods where p.Month == this.Month && p.Year == this.Year select p).Single();
                }
            }
            catch (DbEntityValidationException ex)
            {
                throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
            }
            catch (Exception ex)
            {
                throw new FaultException <DbException>(new DbException(ex));
            }
            return(result);
        }
Exemple #6
0
        public ICrudOperations Add(DbConcurencyUpdateOptions concurencyUpdateOptions, User user)
        {
            concurencyUpdateOptions = DbConcurencyUpdateOptions.ClientPriority;

            if (user.IsAdmin == false)
            {
                throw new FaultException <NoRightsToChangeDataException>(new NoRightsToChangeDataException(user, this.GetType().Name));
            }

            bool isExists = false;

            try
            {
                using (CFAPContext ctx = new CFAPContext())
                {
                    var existsPeriod = (from p in ctx.Periods where p.Month == this.Month && p.Year == this.Year select p).FirstOrDefault();
                    if (existsPeriod != null)
                    {
                        isExists = true;
                    }
                }
            }
            catch (Exception ex)
            {
                throw new FaultException <DbException>(new DbException(ex));
            }


            if (isExists)
            {
                return(Update(concurencyUpdateOptions, user));
            }

            Period result = null;

            try
            {
                using (CFAPContext ctx = new CFAPContext())
                {
                    ctx.Configuration.ProxyCreationEnabled = false;

                    ctx.Periods.Add(this);
                    ctx.SaveChanges(concurencyUpdateOptions);
                    result = (from p in ctx.Periods where p.Month == this.Month && p.Year == this.Year select p).Single();
                }
            }
            catch (DbEntityValidationException ex)
            {
                throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
            }
            catch (Exception ex)
            {
                throw new FaultException <DbException>(new DbException(ex));
            }
            return(result);
        }
Exemple #7
0
        public User UpdateUser(User userForUpdate, User owner)
        {
            //Аутентификация пользователя-владельца
            AuthenticateUser(owner);

            //Проверка - иммеет ли право владелец добавлять или изменять данные пользователей (User.CanAddNewUser)
            this.CheckCanChangeUsersData(owner, typeof(User));

            if (userForUpdate.UserGroups == null || userForUpdate.UserGroups.Count == 0)
            {
                throw new FaultException <UserHasNotGroupsException>(new UserHasNotGroupsException(userForUpdate));
            }

            if (userForUpdate.IsAccountable && userForUpdate.Accountable == null)
            {
                throw new FaultException <AccountableUserHasNotAccountableRefferenceException>(new AccountableUserHasNotAccountableRefferenceException(userForUpdate));
            }

            //Создание экземпляра контекста
            using (CFAPContext ctx = new CFAPContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;

                var oldPassword = (from u in ctx.Users where u.Id == userForUpdate.Id select u.Password).Single();

                if (oldPassword != userForUpdate.Password)
                {
                    userForUpdate.EncriptPassword();
                }

                try
                {
                    //Загрузка в контекст данных о группах пользователя
                    //userForUpdate.LoadUserGroupsFromObject(ctx);
                    userForUpdate.SetRelationships(ctx);

                    //Изменение связей с группами если они изменились
                    userForUpdate.ChangeUserGroups(ctx);

                    ctx.Entry(userForUpdate).State = EntityState.Modified;
                    ctx.SaveChanges(DbConcurencyUpdateOptions.ClientPriority);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }


            return(userForUpdate);
        }
Exemple #8
0
        public Rate UpdateRate(Rate rateToUpdate, User user, DbConcurencyUpdateOptions concurencyUpdateOption)
        {
            AuthenticateUser(user);

            this.ChechIsAdmin(user, typeof(Rate));

            using (CFAPContext ctx = new CFAPContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;

                try
                {
                    ctx.Rates.Attach(rateToUpdate);

                    var ratesToUpdateDbVersion = (Rate)ctx.Entry(rateToUpdate).GetDatabaseValues().ToObject();
                    if (ratesToUpdateDbVersion.ReadOnly)
                    {
                        throw new ReadOnlyException();
                    }

                    ctx.Entry(rateToUpdate).State = EntityState.Modified;
                    rateToUpdate.CustomValidate(ctx);
                    ctx.SaveChanges(concurencyUpdateOption);
                }
                catch (ReadOnlyException)
                {
                    throw new FaultException <TryChangeReadOnlyFiledException>(new TryChangeReadOnlyFiledException(typeof(Rate), rateToUpdate.Id, null, user));
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    var currentValue = rateToUpdate;
                    var dbValue      = (Rate)ex.Entries.Single().GetDatabaseValues().ToObject();

                    ConcurrencyException <Rate> concurrencyException = new ConcurrencyException <Rate>(dbValue, currentValue);
                    throw new FaultException <ConcurrencyException <Rate> >(concurrencyException);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }

            return(rateToUpdate);
        }
Exemple #9
0
        public BudgetItem UpdateBudgetItem(BudgetItem budgetItemToUpdate, User user, DbConcurencyUpdateOptions concurencyUpdateOption)
        {
            AuthenticateUser(user);

            this.ChechIsAdmin(user, typeof(BudgetItem));

            using (CFAPContext ctx = new CFAPContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;

                try
                {
                    ctx.BudgetItems.Attach(budgetItemToUpdate);

                    var budgetItemToUpdateDbVersion = (BudgetItem)ctx.Entry(budgetItemToUpdate).GetDatabaseValues().ToObject();
                    if (budgetItemToUpdateDbVersion.ReadOnly)
                    {
                        throw new ReadOnlyException();
                    }

                    ctx.Entry(budgetItemToUpdate).State = EntityState.Modified;
                    ctx.SaveChanges(concurencyUpdateOption);
                }
                catch (ReadOnlyException)
                {
                    throw new FaultException <TryChangeReadOnlyFiledException>(new TryChangeReadOnlyFiledException(typeof(BudgetItem), budgetItemToUpdate.Id, budgetItemToUpdate.ItemName, user));
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    var currentValue = budgetItemToUpdate;
                    var dbValue      = (BudgetItem)ex.Entries.Single().GetDatabaseValues().ToObject();

                    ConcurrencyException <BudgetItem> concurrencyException = new ConcurrencyException <BudgetItem>(dbValue, currentValue);
                    throw new FaultException <ConcurrencyException <BudgetItem> >(concurrencyException);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }

            return(budgetItemToUpdate);
        }
Exemple #10
0
        public User AddNewUser(User newUser, User owner)
        {
            AuthenticateUser(owner);

            this.CheckCanChangeUsersData(owner, typeof(User));

            if (newUser.UserGroups == null || newUser.UserGroups.Count == 0)
            {
                throw new FaultException <UserHasNotGroupsException>(new UserHasNotGroupsException(newUser));
            }

            if (newUser.Password == null || newUser.Password.Length == 0)
            {
                Dictionary <string, string> errors = new Dictionary <string, string>();
                errors.Add("Password", "Не указан пароль.");
                throw new FaultException <DataNotValidException>(new DataNotValidException(errors));
            }

            if (newUser.IsAccountable && newUser.Accountable == null)
            {
                throw new FaultException <AccountableUserHasNotAccountableRefferenceException>(new AccountableUserHasNotAccountableRefferenceException(newUser));
            }


            newUser.EncriptPassword();

            using (CFAPContext ctx = new CFAPContext())
            {
                try
                {
                    //newUser.LoadUserGroupsFromObject(ctx); //Перенесено в SetRelationships()
                    newUser.SetRelationships(ctx);
                    ctx.Users.Add(newUser);
                    ctx.SaveChanges(DbConcurencyUpdateOptions.ClientPriority);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }

            return(newUser);
        }
Exemple #11
0
        public void ChangeSummaryReadOnlyStatus(bool onOff, Filter filter, User user)
        {
            AuthenticateUser(user);

            bool canReadSummary = false;

            foreach (var g in user.UserGroups)
            {
                if (g.CanReadAccountablesSummary)
                {
                    canReadSummary = true;
                }
            }

            if (!canReadSummary)
            {
                throw new FaultException <AuthenticateFaultException>(new AuthenticateFaultException(user));
            }

            this.ChechIsAdmin(user, typeof(Summary));

            List <Summary> summaries = this.GetSummary(user, filter).ToList();

            using (CFAPContext ctx = new CFAPContext())
            {
                try
                {
                    foreach (var summary in summaries)
                    {
                        ctx.Summaries.Attach(summary);
                        summary.ReadOnly         = onOff;
                        ctx.Entry(summary).State = EntityState.Modified;
                        ctx.SaveChanges(DbConcurencyUpdateOptions.ClientPriority);
                    }
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }
        }
Exemple #12
0
        public Summary RemoveSummary(Summary summary, User user, DbConcurencyUpdateOptions concurencyUpdateOption)
        {
            AuthenticateUser(user);

            bool canReadSummary = false;

            foreach (var g in user.UserGroups)
            {
                if (g.CanReadAccountablesSummary)
                {
                    canReadSummary = true;
                }
            }

            if (!canReadSummary)
            {
                throw new FaultException <AuthenticateFaultException>(new AuthenticateFaultException(user));
            }

            if (summary.CheckPeriodIsUnlocked() == false)
            {
                throw new FaultException <PeriodIsLockedException>(new PeriodIsLockedException(summary.SummaryDate));
            }

            if (concurencyUpdateOption == DbConcurencyUpdateOptions.DatabasePriority)
            {
                throw new FaultException <InvalidOperationException>(new InvalidOperationException("Работа опрации в режиме DbConcurencyUpdateOptions.DatabasePriority не имеет смысла."));
            }

            Summary result = null;


            using (CFAPContext ctx = new CFAPContext())
            {
                if (summary.UserLastChanged == null || summary.UserLastChanged.Id != user.Id)
                {
                    summary.UserLastChanged = user;
                }

                summary.SetRelationships(ctx);

                //Когда сущность проходит через SaveChanges все ассоциации обнуляються. Так как с базы данных после удаления обькт получить невозможно - единственный способ сохранить его состояние через клонирование.
                result = (Summary)summary.Clone();

                try
                {
                    ctx.Summaries.Attach(summary);

                    var summaryDbVersion = (Summary)ctx.Entry(summary).GetDatabaseValues().ToObject();
                    if (summaryDbVersion.ReadOnly)
                    {
                        throw new ReadOnlyException();
                    }

                    ctx.Entry(summary).State = EntityState.Deleted;

                    ctx.SaveChanges(concurencyUpdateOption);
                    //Ссылочные свойства (связи в БД) больше не отслеживаютсья контекстом и подлежать востановлению только вручную, через явное указание Id и поиск в БД сущности связи по идентификатору.
                }
                catch (ReadOnlyException)
                {
                    throw new FaultException <TryChangeReadOnlyFiledException>(new TryChangeReadOnlyFiledException(typeof(Summary), summary.Id, null, user));
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    Summary dbSummary      = (Summary)ex.Entries.Single().GetDatabaseValues().ToObject();
                    Summary currentSummary = result;

                    //Метод Load не загрузит ссылочные свойства без конкретного указания Id.
                    //Свойство коллекции UserGroups является связью многие-ко-многим. Экземпляр сущности не содержит ключи этих связей в виде элементарных типов данных.
                    //dbSummary.UserGroups = result.UserGroups;

                    dbSummary = LoadRelationshipsDbSummary(dbSummary);

                    ConcurrencyException <Summary> concurrencyException = new ConcurrencyException <Summary>(dbSummary, currentSummary);

                    throw new FaultException <ConcurrencyException <Summary> >(concurrencyException);
                }
                catch (NullReferenceException ex)
                {
                    throw new FaultException <FiledDeletedException>(new FiledDeletedException(ex));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }

            return(result);
        }
Exemple #13
0
        public Summary UpdateSummary(Summary summary, User user, DbConcurencyUpdateOptions concurencyUpdateOption)
        {
            //Изменение значения поля ReadOnly осуществляеться другой операцией службы


            AuthenticateUser(user);

            bool canReadSummary = false;

            foreach (var g in user.UserGroups)
            {
                if (g.CanReadAccountablesSummary)
                {
                    canReadSummary = true;
                }
            }

            if (!canReadSummary)
            {
                throw new FaultException <AuthenticateFaultException>(new AuthenticateFaultException(user));
            }

            if (summary.CheckPeriodIsUnlocked() == false)
            {
                throw new FaultException <PeriodIsLockedException>(new PeriodIsLockedException(summary.SummaryDate));
            }

            //Пользователь который изменил данные устанавливается по факту
            if (summary.UserLastChanged == null || summary.UserLastChanged.Id != user.Id)
            {
                summary.UserLastChanged = user;
            }
            summary.SetAutoValues();

            Summary result = null;

            using (CFAPContext ctx = new CFAPContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;

                try
                {
                    //Группы пользователей уже существуют в сущности
                    //Если, по какой то причине их нет - будет исключение валидации

                    summary.SetRelationships(ctx);

                    //В данном случае AddOrUpdate не сработает в выдаче исключения оптимистичного паралелизма. Он перезагружет сущности в контекс и формирует уже актуальное поле RowVersion
                    ctx.Summaries.Attach(summary);

                    var summaryDbVersion = (Summary)ctx.Entry(summary).GetDatabaseValues().ToObject();
                    if (summaryDbVersion.ReadOnly)
                    {
                        throw new ReadOnlyException();
                    }

                    ctx.Entry(summary).State = EntityState.Modified;

                    //Ручной запуск валидации необходм так как при модификации данных связи с сущностями помечены как EntityState.Unchanged
                    //В итоге, без ручной валидации, при неверных данных или значениях null будет исключения при внесении данных в бд, а валидация EF ничего не заметит
                    summary.CustomValidate(ctx);

                    ctx.SaveChanges(concurencyUpdateOption);

                    result = (from s in ctx.Summaries where s.Id == summary.Id select s).Single();
                }
                catch (ReadOnlyException)
                {
                    throw new FaultException <TryChangeReadOnlyFiledException>(new TryChangeReadOnlyFiledException(typeof(Summary), summary.Id, null, user));
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    Summary dbSummary      = (Summary)ex.Entries.Single().GetDatabaseValues().ToObject();
                    Summary currentSummary = summary;

                    dbSummary = LoadRelationshipsDbSummary(dbSummary);

                    ConcurrencyException <Summary> concurrencyException = new ConcurrencyException <Summary>(dbSummary, currentSummary);
                    throw new FaultException <ConcurrencyException <Summary> >(concurrencyException);
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (NullReferenceException ex)
                {
                    throw new FaultException <FiledDeletedException>(new FiledDeletedException(ex));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }


            return(result);
        }
Exemple #14
0
        public Summary AddSummary(Summary summary, User user)
        {
            AuthenticateUser(user);

            bool canReadSummary = false;

            foreach (var g in user.UserGroups)
            {
                if (g.CanReadAccountablesSummary)
                {
                    canReadSummary = true;
                }
            }

            if (!canReadSummary)
            {
                throw new FaultException <AuthenticateFaultException>(new AuthenticateFaultException(user));
            }

            if (summary.CheckPeriodIsUnlocked() == false)
            {
                throw new FaultException <PeriodIsLockedException>(new PeriodIsLockedException(summary.SummaryDate));
            }

            //if (summary.UserGroups == null || summary.UserGroups.Count == 0)
            //{
            //    summary.UserGroups = user.UserGroups;
            //}

            if (summary.UserLastChanged == null || summary.UserLastChanged.Id != user.Id)
            {
                summary.UserLastChanged = user;
            }

            summary.SetAutoValues();

            Summary result = null;

            using (CFAPContext ctx = new CFAPContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;

                summary.SetRelationships(ctx);

                try
                {
                    ctx.Summaries.Add(summary);

                    ctx.SaveChanges(DbConcurencyUpdateOptions.ClientPriority);

                    result = summary;
                }
                catch (DbEntityValidationException ex)
                {
                    throw new FaultException <DataNotValidException>(new DataNotValidException(ex.EntityValidationErrors));
                }
                catch (Exception ex)
                {
                    throw new FaultException <DbException>(new DbException(ex));
                }
            }

            return(result);
        }