public IHttpActionResult GetUsers([FromUri] AdminGetUsersBindingModel model)
        {
            // Validate the input parameters
            if (!ModelState.IsValid)
            {
                return(this.BadRequest(this.ModelState));
            }

            // Select all users, ordered by the specified column
            var users = this.Data.Users.All();

            if (model.OrderByColumn != null)
            {
                if (model.SortDirection.HasValue && model.SortDirection == SortDirection.Ascending)
                {
                    users = users.OrderBy(model.OrderByColumn);
                }
                else
                {
                    users = users.OrderByDescending(model.OrderByColumn);
                }
            }

            // Find the requested page (by given start page and page size)
            int pageSize = Settings.Default.DefaultPageSize;

            if (model.PageSize.HasValue)
            {
                pageSize = model.PageSize.Value;
            }
            var numPages = (users.Count() + pageSize - 1) / pageSize;

            if (model.StartPage.HasValue)
            {
                users = users.Skip(pageSize * (model.StartPage.Value - 1));
            }
            users = users.Take(pageSize);

            // Select the columns to be returned
            var usersToReturn = users.ToList().Select(u => new
            {
                id          = u.Id,
                username    = u.UserName,
                name        = u.Name,
                email       = u.Email,
                phoneNumber = u.PhoneNumber
            });

            return(this.Ok(
                       new
            {
                numPages,
                users = usersToReturn
            }
                       ));
        }
        public IHttpActionResult GetUsers([FromUri] AdminGetUsersBindingModel model)
        {
            if (model == null)
            {
                // When no parameters are passed, the model is null, so we create an empty model
                model = new AdminGetUsersBindingModel();
            }

            // Validate the input parameters
            if (!ModelState.IsValid)
            {
                return(this.BadRequest(this.ModelState));
            }

            // Select all users along with their roles
            var users = this.Data.Users.All().Include(u => u.Roles).Include(u => u.Town);

            // Apply sorting by the specified column / expression (prefix '-' for descending)
            if (model.SortBy != null)
            {
                try
                {
                    // Apply custom sorting order by the specified column / expression
                    if (model.SortBy.StartsWith("-"))
                    {
                        users = users.OrderByDescending(model.SortBy.Substring(1)).ThenBy(u => u.Id);
                    }
                    else
                    {
                        users = users.OrderBy(model.SortBy).ThenBy(u => u.Id);
                    }
                }
                catch (Exception)
                {
                    return(this.BadRequest("Invalid sorting expression: " + model.SortBy));
                }
            }
            else
            {
                // Apply the default sorting order: by username
                users = users.OrderBy(u => u.UserName).ThenBy(u => u.Id);
            }

            // Apply paging: find the requested page (by given start page and page size)
            int pageSize = Settings.Default.DefaultPageSize;

            if (model.PageSize.HasValue)
            {
                pageSize = model.PageSize.Value;
            }
            var numItems = users.Count();
            var numPages = (numItems + pageSize - 1) / pageSize;

            if (model.StartPage.HasValue)
            {
                users = users.Skip(pageSize * (model.StartPage.Value - 1));
            }
            users = users.Take(pageSize);

            // Select the admin role ID
            var adminRoleId = this.Data.UserRoles.All().First(r => r.Name == "Administrator").Id;

            // Select the columns to be returned
            var usersToReturn = users.ToList().Select(u => new
            {
                id          = u.Id,
                username    = u.UserName,
                name        = u.Name,
                email       = u.Email,
                phoneNumber = u.PhoneNumber,
                townId      = u.TownId,
                townName    = u.TownId != null ? u.Town.Name : null,
                isAdmin     = u.Roles.Any(r => r.RoleId == adminRoleId)
            });

            return(this.Ok(
                       new
            {
                numItems,
                numPages,
                users = usersToReturn
            }
                       ));
        }