public override string[] GetRolesForUser(string login)
        {
            string[] role = new string[] { };
            using (HomeServerContext _db = new HomeServerContext())
            {
                try
                {
                    // Получаем пользователя
                    User user = (from u in _db.Users
                                 where u.Login == login
                                 select u).FirstOrDefault();
                    if (user != null)
                    {
                        // получаем роль
                        Role userRole = _db.Roles.Find(user.RoleId);

                        if (userRole != null)
                        {
                            role = new string[] { userRole.Name };
                        }
                    }
                }
                catch
                {
                    role = new string[] { };
                }
            }
            return role;
        }
        public override bool IsUserInRole(string username, string roleName)
        {
            bool outputResult = false;
            // Находим пользователя
            using (HomeServerContext _db = new HomeServerContext())
            {
                try
                {
                    // Получаем пользователя
                    User user = (from u in _db.Users
                                 where u.Login == username
                                 select u).FirstOrDefault();
                    if (user != null)
                    {
                        // получаем роль
                        Role userRole = _db.Roles.Find(user.RoleId);

                        //сравниваем
                        if (userRole != null && userRole.Name == roleName)
                        {
                            outputResult = true;
                        }
                    }
                }
                catch
                {
                    outputResult = false;
                }
            }
            return outputResult;
        }
        public void AddUserToGroup(HomeServerContext context, int studentId, int groupId, DateTime date)
        {
            Student student = context.Students.Find(studentId);
            Group group = context.Groups.Find(groupId);

            if (student == null)
                return;

            if (group == null)
                return;

            if(group.Students.Contains(student))
                return;

            student.GroupId = group.Id;

            //get active packs for this group
            var temp = context.Packs.Where(p => p.Course.CourseStateId == 2).ToList();

            List<Pack> packs = new List<Pack>();

            foreach(var t in temp)
            {
                foreach(var g in t.Groups)
                {
                    if (g.Id == groupId)
                    {
                        packs.Add(t);
                    }
                }
            }

            //add visits and studentProcs for each packs
            foreach(var pack in packs)
            {
                foreach(var lesson in pack.Lessons)
                {
                    if(lesson.Date < date)
                        continue;

                    lesson.Visits.Add(new Visit()
                    {
                        StudentId = student.Id,
                        Values = new List<VisitValue>()
                        {
                            new VisitValue()
                            {
                                Value = VisitValue.DEFAULT_VALUE,
                                Version = 1
                            }
                        }
                    });
                }

                foreach(var workProc in pack.WorkProcs)
                {
                    var work = context.Works.Find(workProc.WorkId);
                    work.WorkStages = context.WorkStages.Where(ws => ws.WorkId == workProc.WorkId).ToList();

                    StudentWorkProc studentProc = new StudentWorkProc()
                    {
                        StudentId = student.Id,
                        Values = new List<StudentWorkProcValue>() { new StudentWorkProcValue() { Version = 1 } },
                        StudentStageProcs = new List<StudentStageProc>()
                    };

                    foreach (var workStage in work.WorkStages)
                    {
                        studentProc.StudentStageProcs.Add(new StudentStageProc()
                        {
                            WorkStageId = workStage.Id,
                            Values = new List<StudentStageProcValue>() { new StudentStageProcValue() { Version = 1 } }
                        });
                    }

                    workProc.StudentWorkProcs.Add(studentProc);
                }
            }

            StudentTransaction studentTransaction = new StudentTransaction()
            {
                Student = student,
                Group = group,
                Date = date
            };

            context.StudentTransaction.Add(studentTransaction);

            context.SaveChanges();
        }
        public void RemoveUserFromGroup(HomeServerContext context, int studentId)
        {
            Student student = context.Students.Find(studentId);

            if (student == null)
            {
                return;
            }
            else
            {
                student.GroupId = null;

                StudentTransaction studentTransaction = new StudentTransaction()
                {
                    Student = student,
                    GroupId = null,
                    Date = DateTime.Now
                };

                context.StudentTransaction.Add(studentTransaction);

                context.SaveChanges();
            }
        }
        private bool ValidateUser(string login, string password)
        {
            bool isValid = false;

            using (HomeServerContext _db = new HomeServerContext())
            {
                try
                {
                    User user = (from u in _db.Users
                                 where u.Login == login && u.Password == password
                                 select u).FirstOrDefault();

                    if (user != null)
                    {
                        isValid = true;
                    }
                }
                catch(Exception e)
                {
                    isValid = false;
                }
            }
            return isValid;
        }
        // POST api/<controller>
        public HttpResponseMessage Post([FromBody]NewCourseModel courseModel)
        {
            var course = courseModel.Course;
            var user = GetCurrentUser();

            //check existed course with same Year and Term
            var existedCourse = db.Courses.FirstOrDefault(c => c.TermId == course.Term.Id && c.Year == course.Year && c.UserId == user.Id);

            if(existedCourse != null)
            {
                HttpError err = new HttpError("У вас уже есть курс данного семестра на выбранный год");
                return Request.CreateResponse(HttpStatusCode.Forbidden, err);
            }

            var term = db.Terms.Find(course.Term.Id);

            var newCourse = new Course()
            {
                Term = term,
                Year = course.Year,
                User = user,
                CourseState = db.CourseStates.Find(1),
                Packs = new List<Pack>()
            };

            foreach (var pack in course.Packs)
            {
                var packGroupIds = pack.Groups.Select(g => g.Id);

                var packType = db.PackTypes.Find(pack.PackType.Id);
                var groups = db.Groups.Where(g => packGroupIds.Contains(g.Id)).ToList();

                newCourse.Packs.Add(new Pack()
                {
                    PackType = packType,
                    Groups = groups
                });
            }

            List<Work> prevCourseWorks = new List<Work>();

            using(HomeServerContext context = new HomeServerContext())
            {
                var prevCourse = context.Courses.Find(courseModel.PrevId);

                if (prevCourse != null)
                {
                    foreach (var work in prevCourse.Works)
                    {
                        var workCopy = new Work()
                        {
                            Name = work.Name,
                            ShortName = work.ShortName,
                            HasThemes = work.HasThemes,
                            WorkTypeId = work.WorkTypeId,
                            WorkControlTypeId = work.WorkControlTypeId,
                            WorkStages = new List<WorkStage>()
                        };

                        prevCourseWorks.Add(workCopy);

                        var tempStages = context.WorkStages.Where(cws => cws.WorkId == work.Id
                            && cws.ParentWorkStageId == null).ToList();

                        var stages = tempStages.Select(ws => new WorkStage() { Id = ws.Id, Name = ws.Name, Optional = ws.Optional})
                            .ToList();

                        for (int i = 0; i < stages.Count; i++)
                        {
                            var workStage = stages[i];

                            var tempSubstages = context.WorkStages
                                .Where(cws => cws.ParentWorkStageId == workStage.Id).ToList();

                            workStage.SubStages = tempSubstages
                                .Select(ws => new WorkStage() { Id = ws.Id, Name = ws.Name, Optional = ws.Optional })
                                .ToList();
                        }

                        workCopy.WorkStages = stages;
                    }
                }
            }

            newCourse = db.Courses.Add(newCourse);
            db.SaveChanges();

            //copy works from previous course

            //if (prevCourse != null)
            //{
                db.SaveChanges();

                foreach (var work in prevCourseWorks)
                {
                    var newWork = new Work()
                    {
                        Course = newCourse,
                        Name = work.Name,
                        ShortName = work.ShortName,
                        HasThemes = work.HasThemes,
                        WorkTypeId = work.WorkTypeId,
                        WorkControlTypeId = work.WorkControlTypeId
                    };

                    db.SaveChanges();
                    newWork = db.Works.Add(newWork);
                    db.SaveChanges();

                    foreach(var workStage in work.WorkStages)
                    {
                        var newWorkStage = new WorkStage()
                        {
                            Name = workStage.Name,
                            Optional = workStage.Optional,
                            Work = newWork
                        };

                        newWorkStage = db.WorkStages.Add(newWorkStage);
                        db.SaveChanges();

                        if (workStage.SubStages != null)
                        {
                            foreach (var subStage in workStage.SubStages)
                            {
                                var newSubStage = new WorkStage()
                                {
                                    Name = subStage.Name,
                                    Optional = subStage.Optional,
                                    ParentStage = newWorkStage,
                                    Work = newWork
                                };

                                db.WorkStages.Add(newSubStage);
                                db.SaveChanges();
                            }
                        }
                    }
                }
            //}

            db.SaveChanges();
            return Request.CreateResponse(HttpStatusCode.OK);
        }
 public WorkThemeCommitService(HomeServerContext context)
 {
     this.context = context;
 }