public IHttpActionResult PostRole(RoleViewModel role_viewModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            Role role = new Role {
                Id = role_viewModel.Id, Name = role_viewModel.Name
            };

            db.Roles.Add(role);
            try
            {
                db.SaveChanges();

                //寫入AccessLog
                MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Create, "Role", JsonConvert.SerializeObject(new { role.Id, role.Name }));
            }
            catch (DbEntityValidationException ex)
            {
                var entityError      = ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var getFullMessage   = string.Join("; ", entityError);
                var exceptionMessage = string.Concat(ex.Message, "errors are: ", getFullMessage);
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, exceptionMessage));
            }

            return(CreatedAtRoute("GetRoleById", new { id = role.Id }, ToRoleViewModel(role)));
        }
        public IHttpActionResult DeleteUser(string userName)
        {
            User user = db.Users.Find(userName);

            if (user == null)
            {
                return(NotFound());
            }

            db.Users.Remove(user);
            try
            {
                db.SaveChanges();

                //寫入AccessLog
                MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Delete, "User", userName);
            }
            catch (Exception ex)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message));
            }

            return(Ok(new UserViewModel {
                UserName = userName
            }));
        }
        public IHttpActionResult PostUserMenu(UserMenuViewModel userMenu)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var user = db.Users.Find(userMenu.UserName);

            if (user == null)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound, "不存在的使用者!"));
            }

            var menus = db.Menus.Where(item => item.Id == userMenu.MenuId || item.ParentId == userMenu.MenuId);

            foreach (var item in menus)
            {
                user.Menus.Add(item);
            }

            try
            {
                db.SaveChanges();

                //寫入AccessLog
                MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Create, "UserMenu", JsonConvert.SerializeObject(new { user.UserName, Menus = menus.Select(m => m.Id + m.Text).ToArray() }));
            }
            catch (Exception ex)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message));
            }
            return(Ok());
        }
        public IHttpActionResult DeleteRole(int id)
        {
            Role role_db = db.Roles.Find(id);

            if (role_db == null)
            {
                return(NotFound());
            }

            try
            {
                db.Roles.Remove(role_db);
                db.SaveChanges();

                //寫入AccessLog
                MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Delete, "Role", role_db.Name);
            }
            catch (DbEntityValidationException ex)
            {
                var entityError      = ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var getFullMessage   = string.Join("; ", entityError);
                var exceptionMessage = string.Concat(ex.Message, "errors are: ", getFullMessage);
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, exceptionMessage));
            }

            return(Ok(new RoleViewModel {
                Id = id
            }));
        }
        public IHttpActionResult PutUser(string userName, UserPasswordViewModel user_view_model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (string.IsNullOrWhiteSpace(user_view_model.Password))
            {
                return(ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.NotModified, "取消變更")));
            }

            if (userName != user_view_model.UserName)
            {
                return(BadRequest());
            }

            //把資料庫中的那筆資料讀出來
            var user_db = db.Users.Find(userName);

            if (user_db == null)
            {
                return(ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.NotFound, "這筆資料已被刪除!")));
            }
            else
            {
                try
                {
                    user_db.Password = user_view_model.Password;
                    //db.Entry(user_db).OriginalValues["Timestamp"] = Convert.FromBase64String(user_view_model.TimestampString);
                    db.SaveChanges();

                    //寫入AccessLog
                    MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.PasswordChanged, "User", user_db.UserName);
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!UserExists(userName))
                    {
                        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound, "這筆資料已被刪除!"));
                    }
                    else
                    {
                        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Conflict, "這筆資料已被其他人修改!"));// ""
                    }
                }
            }

            return(Ok(ToUserViewModel(user_db)));
        }
        public IHttpActionResult Put(int id, MenuViewModel item_viewModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != item_viewModel.Id)
            {
                return(BadRequest());
            }

            //把資料庫中的那筆資料讀出來
            var item_db = db.Menus.Find(id);

            if (item_db == null)
            {
                return(ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.NotFound, "這筆資料已被刪除!")));
            }
            else
            {
                try
                {
                    item_db.Text       = item_viewModel.Text;
                    item_db.ContentUrl = item_viewModel.ContentUrl;
                    item_db.CssClass   = item_viewModel.CssClass;
                    item_db.ParentId   = item_viewModel.ParentId;
                    db.Entry(item_db).OriginalValues["Timestamp"] = Convert.FromBase64String(item_viewModel.TimestampString);
                    db.SaveChanges();

                    //寫入AccessLog
                    MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Update, "Menu",
                                           JsonConvert.SerializeObject(new { item_db.Id, item_db.Text, item_db.ContentUrl, item_db.ParentId }));
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (db.Menus.Find(id) == null)
                    {
                        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound, "這筆資料已被刪除!"));
                    }
                    else
                    {
                        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Conflict, "這筆資料已被其他人修改!"));
                    }
                }
            }

            return(Ok(ToMenuViewModel(item_db)));
        }
        public IHttpActionResult PostUser(UserViewModel user_view_model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var role = db.Roles.Find(user_view_model.RoleId);

            if (role == null)
            {
                return(ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.NotFound, "沒有對應的角色!")));
            }

            User user = db.Users.Find(user_view_model.UserName);

            if (user == null)
            {
                try
                {
                    //新增使用者
                    user = new User {
                        UserName = user_view_model.UserName, Password = user_view_model.UserName, Role = role
                    };
                    db.Users.Add(user);

                    //新增使用者角色的功能選單
                    foreach (var menu in role.Menus)
                    {
                        user.Menus.Add(menu);
                    }

                    //寫入資料庫
                    db.SaveChanges();

                    //寫入AccessLog
                    MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Create, "User",
                                           JsonConvert.SerializeObject(new { user.UserName, roleName = user.Role.Name }));
                }
                catch (Exception ex)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message));
                }
            }
            return(CreatedAtRoute("GetUserByUserName", new { userName = user.UserName }, ToUserViewModel(user)));
        }
        public IHttpActionResult PutRole(int id, RoleViewModel role_viewModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != role_viewModel.Id)
            {
                return(BadRequest());
            }

            //把資料庫中的那筆資料讀出來
            var role_db = db.Roles.Find(id);

            if (role_db == null)
            {
                return(ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.NotFound, "這筆資料已被刪除!")));
            }
            else
            {
                try
                {
                    role_db.Name = role_viewModel.Name;
                    db.Entry(role_db).OriginalValues["Timestamp"] = Convert.FromBase64String(role_viewModel.TimestampString);
                    db.SaveChanges();

                    //寫入AccessLog
                    MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Update, "Role", JsonConvert.SerializeObject(new { role_db.Id, role_db.Name }));
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (db.Roles.Find(id) == null)
                    {
                        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound, "這筆資料已被刪除!"));
                    }
                    else
                    {
                        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Conflict, "這筆資料已被其他人修改!"));
                    }
                }
            }

            return(Ok(ToRoleViewModel(role_db)));
        }
        public IHttpActionResult Delete(int id)
        {
            Menu item_db = db.Menus.Find(id);

            if (item_db == null)
            {
                return(NotFound());
            }

            //db.Menus.Remove(item_db);
            db.Menus.RemoveRange(db.Menus.Where(item => item.ParentId == id || item.Id == id));
            db.SaveChanges();

            //寫入AccessLog
            MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Delete, "Menu",
                                   JsonConvert.SerializeObject(new { item_db.Id, item_db.Text, item_db.ContentUrl, item_db.ParentId }));

            return(Ok(new MenuViewModel {
                Id = id
            }));
        }
        public IHttpActionResult DeleteRoleMenu(RoleMenuViewModel roleMenu)
        {
            var role = db.Roles.Find(roleMenu.RoleId);

            if (role == null)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound, "不存在的RoleId!"));
            }

            var menus = db.Menus.Where(item => item.Id == roleMenu.MenuId || item.ParentId == roleMenu.MenuId);

            foreach (var item in menus)
            {
                role.Menus.Remove(item);
                //role.Menus.Remove(db.Menus.Find(item.ParentId));
            }

            db.SaveChanges();

            //寫入AccessLog
            MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Delete, "RoleMenu", JsonConvert.SerializeObject(new { role.Id, role.Name, Menus = menus.Select(m => m.Id + m.Text).ToArray() }));

            return(Ok());
        }
        public IHttpActionResult Post(MenuViewModel item_viewModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            Menu item = new Menu {
                Id         = item_viewModel.Id,
                Text       = item_viewModel.Text,
                ContentUrl = item_viewModel.ContentUrl,
                CssClass   = item_viewModel.CssClass,
                ParentId   = item_viewModel.ParentId
            };

            db.Menus.Add(item);
            try
            {
                db.SaveChanges();

                //寫入AccessLog
                MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Create, "Menu", JsonConvert.SerializeObject(new { item.Id, item.Text, item.ContentUrl, item.ParentId }));
            }
            catch (DbEntityValidationException ex)
            {
                var entityError      = ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var getFullMessage   = string.Join("; ", entityError);
                var exceptionMessage = string.Concat(ex.Message, "errors are: ", getFullMessage);
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, exceptionMessage));
            }
            catch (DbUpdateException ex)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, ex.InnerException.Message));
            }

            return(CreatedAtRoute("DefaultApi", new { id = item.Id }, ToMenuViewModel(item)));
        }
        public IHttpActionResult PutUser(string userName, UserViewModel user_view_model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (userName != user_view_model.UserName)
            {
                return(BadRequest());
            }

            //把資料庫中的那筆資料讀出來
            var user_db = db.Users.Find(userName);

            if (user_db == null)
            {
                return(ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.NotFound, "這筆資料已被刪除!")));
            }
            else
            {
                try
                {
                    //移除舊角色功能選單
                    foreach (var item in user_db.Role.Menus)
                    {
                        user_db.Menus.Remove(item);
                    }

                    //更新新角色
                    user_db.Role_Id = user_view_model.RoleId;
                    db.Entry(user_db).OriginalValues["Timestamp"] = Convert.FromBase64String(user_view_model.TimestampString);
                    db.SaveChanges();

                    //加入新角色功能選單
                    var roleMenus = user_db.Role.Menus;
                    foreach (var item in roleMenus)
                    {
                        user_db.Menus.Add(item);
                    }
                    db.SaveChanges();

                    //寫入AccessLog
                    MPAccessLog.WriteEntry(User.Identity.Name, AccessAction.Update, "User",
                                           JsonConvert.SerializeObject(new { user_db.UserName, roleName = user_db.Role.Name }));
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!UserExists(userName))
                    {
                        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound, "這筆資料已被刪除!"));
                    }
                    else
                    {
                        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Conflict, "這筆資料已被其他人修改!"));// ""
                    }
                }
                catch (Exception ex)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message));
                }
            }

            return(Ok(ToUserViewModel(user_db)));
        }