public IHandlerBuilder Index(int page, bool inactive, IRequest request)
        {
            if (page < 1)
            {
                page = 1;
            }

            using var context = Database.Create();

            IQueryable <Account> query = context.Accounts;

            if (!inactive)
            {
                query = query.Where(u => u.Active);
            }

            var total = query.Count();

            var records = query.Skip((page - 1) * PAGE_SIZE)
                          .Take(PAGE_SIZE)
                          .OrderBy(u => u.DisplayName)
                          .ToList();

            var pages = (total + PAGE_SIZE - 1) / PAGE_SIZE;

            var paged = new PagedList <Account>(records, page, pages, total);

            var user = AccessControl.GetAccount(request);

            var list = new AccountList(user, paged);

            return(ModRazor.Page(Resource.FromAssembly("Account.List.cshtml"), (r, h) => new ViewModel <AccountList>(r, h, list))
                   .Title("Mitarbeiter"));
        }
        public IHandlerBuilder?Activate([FromPath] int id, IRequest request)
        {
            var user = AccessControl.GetAccount(request);

            if (!user.Admin)
            {
                throw new ProviderException(ResponseStatus.Forbidden, "Your are not allowed to activate this user.");
            }

            using var context = Database.Create();

            var account = context.Accounts
                          .Where(c => c.ID == id)
                          .FirstOrDefault();

            if (account == null)
            {
                return(null);
            }

            account.Active = true;

            context.SaveChanges();

            return(Redirect.To($"{{controller}}/details/{id}/", true));
        }
        public IHandlerBuilder?Edit([FromPath] int id, IRequest request)
        {
            var user = AccessControl.GetAccount(request);

            if (!user.Admin && !(user.ID == id))
            {
                throw new ProviderException(ResponseStatus.Forbidden, "Your are not allowed to edit this user.");
            }

            using var context = Database.Create();

            var account = context.Accounts
                          .Where(c => c.ID == id)
                          .FirstOrDefault();

            if (account == null)
            {
                return(null);
            }

            var viewModel = new AccountDetails(user, account);

            return(ModRazor.Page(Resource.FromAssembly("Account.Editor.cshtml"), (r, h) => new ViewModel <AccountDetails>(r, h, viewModel))
                   .Title($"{account.DisplayName}"));
        }
        public IHandlerBuilder?Details([FromPath] int id, IRequest request)
        {
            var user = AccessControl.GetAccount(request);

            using var context = Database.Create();

            var account = context.Accounts
                          .Where(c => c.ID == id)
                          .FirstOrDefault();

            if (account == null)
            {
                return(null);
            }

            var viewModel = new AccountDetails(user, account);

            return(ModRazor.Page(Resource.FromAssembly("Account.Details.cshtml"), (r, h) => new ViewModel <AccountDetails>(r, h, viewModel))
                   .Title($"{account.DisplayName}"));
        }
        public IHandlerBuilder?Edit([FromPath] int id, Account account, IRequest request)
        {
            var user = AccessControl.GetAccount(request);

            if (!user.Admin && !(user.ID == id))
            {
                throw new ProviderException(ResponseStatus.Forbidden, "Your are not allowed to edit this user.");
            }

            using var context = Database.Create();

            var existing = context.Accounts
                           .Where(c => c.ID == id)
                           .FirstOrDefault();

            if (existing == null)
            {
                return(null);
            }

            existing.Name        = account.Name.Trim();
            existing.DisplayName = account.DisplayName.Trim();

            if (user.Admin)
            {
                existing.Admin = account.Admin;
            }

            if (!string.IsNullOrEmpty(account.Password))
            {
                existing.Password = AccessControl.Hash(account.Password);
            }

            existing.Modified = DateTime.UtcNow;

            context.SaveChanges();

            return(Redirect.To($"{{controller}}/details/{id}/", true));
        }