diff --git a/app/Contracts/UserRepository.php b/app/Contracts/UserRepository.php index 53bab8a..66c0f74 100644 --- a/app/Contracts/UserRepository.php +++ b/app/Contracts/UserRepository.php @@ -10,6 +10,8 @@ interface UserRepository public function getUserById($id): PromiseInterface; + public function paginateUsers(int $perPage, int $currentPage): PromiseInterface; + public function getUserByToken(string $authToken): PromiseInterface; public function storeUser(array $data): PromiseInterface; diff --git a/app/Server/Http/Controllers/Admin/GetUsersController.php b/app/Server/Http/Controllers/Admin/GetUsersController.php index 49671a2..933f38e 100644 --- a/app/Server/Http/Controllers/Admin/GetUsersController.php +++ b/app/Server/Http/Controllers/Admin/GetUsersController.php @@ -21,10 +21,10 @@ class GetUsersController extends AdminController public function handle(Request $request, ConnectionInterface $httpConnection) { $this->userRepository - ->getUsers() - ->then(function ($users) use ($httpConnection) { + ->paginateUsers(20, (int) $request->get('page', 1)) + ->then(function ($paginated) use ($httpConnection) { $httpConnection->send( - respond_json(['users' => $users]) + respond_json(['paginated' => $paginated]) ); $httpConnection->close(); diff --git a/app/Server/Http/Controllers/Admin/ListUsersController.php b/app/Server/Http/Controllers/Admin/ListUsersController.php index 1dbf692..2fff138 100644 --- a/app/Server/Http/Controllers/Admin/ListUsersController.php +++ b/app/Server/Http/Controllers/Admin/ListUsersController.php @@ -21,10 +21,10 @@ class ListUsersController extends AdminController public function handle(Request $request, ConnectionInterface $httpConnection) { $this->userRepository - ->getUsers() - ->then(function ($users) use ($httpConnection) { + ->paginateUsers(20, (int) $request->get('page', 1)) + ->then(function ($paginated) use ($httpConnection) { $httpConnection->send( - respond_html($this->getView($httpConnection, 'server.users.index', ['users' => $users])) + respond_html($this->getView($httpConnection, 'server.users.index', ['paginated' => $paginated])) ); $httpConnection->close(); diff --git a/app/Server/UserRepository/DatabaseUserRepository.php b/app/Server/UserRepository/DatabaseUserRepository.php index 8095817..8da4eb5 100644 --- a/app/Server/UserRepository/DatabaseUserRepository.php +++ b/app/Server/UserRepository/DatabaseUserRepository.php @@ -31,6 +31,35 @@ class DatabaseUserRepository implements UserRepository return $deferred->promise(); } + public function paginateUsers(int $perPage, int $currentPage): PromiseInterface + { + $deferred = new Deferred(); + + $this->database + ->query('SELECT * FROM users ORDER by created_at DESC LIMIT :limit OFFSET :offset', [ + 'limit' => $perPage + 1, + 'offset' => $currentPage < 2 ? 0 : ($currentPage - 1) * $perPage, + ]) + ->then(function (Result $result) use ($deferred, $perPage, $currentPage) { + if(count($result->rows) == $perPage + 1) { + array_pop($result->rows); + $nextPage = $currentPage + 1; + } + + $paginated = [ + 'users' => $result->rows, + 'current_page' => $currentPage, + 'per_page' => $perPage, + 'next_page' => $nextPage ?? null, + 'previous_page' => $currentPage > 1 ? $currentPage - 1 : null, + ]; + + $deferred->resolve($paginated); + }); + + return $deferred->promise(); + } + public function getUserById($id): PromiseInterface { $deferred = new Deferred(); diff --git a/resources/views/server/users/index.twig b/resources/views/server/users/index.twig index 2ccc0f4..6d2ec62 100644 --- a/resources/views/server/users/index.twig +++ b/resources/views/server/users/index.twig @@ -75,6 +75,27 @@ + +
+ + + +
+
The expose server does not have any users yet.
@@ -94,10 +115,25 @@ name: '', errors: {}, }, - users: {{ users|json_encode|raw }} + paginated: {{ paginated|json_encode|raw }} + }, + + computed: { + users : function() { + return this.paginated.users; + } }, methods: { + getUsers(page) { + fetch('/api/users?page=' + page) + .then((response) => { + return response.json(); + }).then((data) => { + this.paginated = data.paginated; + }); + }, + deleteUser(user) { fetch('/api/users/' + user.id, { method: 'DELETE',