@@ -3,13 +3,32 @@ | |||
namespace App\Http\Controllers; | |||
use Illuminate\Http\Request; | |||
use App\Knockout\Event; | |||
use App\Knockout\User; | |||
class UserController extends Controller { | |||
public function get() | |||
public function all(Request $request) | |||
{ | |||
return 'not implemented'; | |||
$page = $request->route('page', 0); | |||
$query = $request->get('query', ''); | |||
$users = User::all($page, $query); | |||
return view('page/users', [ | |||
'query' => $query, | |||
'users' => $users->getRecords(), | |||
'paginator' => $users->getPaginator($request) | |||
]); | |||
} | |||
public function one(Request $request) | |||
{ | |||
$userId = $request->route('user', null); | |||
$user = User::one($userId); | |||
return view('page/user', [ | |||
'user' => $user->getRecord() | |||
]); | |||
} | |||
public function posts() | |||
@@ -69,7 +69,17 @@ class Dataset | |||
{ | |||
$exactPages = ($this->totalRecords / $this->recordsPerPage); | |||
$pages = ceil($exactPages); | |||
return ($pages == $exactPages) ? floor($exactPages) : $pages; | |||
$pages = ($pages == $exactPages) ? floor($exactPages) : $pages; | |||
return ($pages < 1) ? 1 : $pages; | |||
} | |||
private function queryParams(array $query) | |||
{ | |||
$output = []; | |||
foreach ($query as $key => $item) { | |||
$output[] = sprintf('%s=%s', $key, urlencode($item)); | |||
} | |||
return '?' . implode('&', $output); | |||
} | |||
public function getPaginator(Request $request) | |||
@@ -79,15 +89,16 @@ class Dataset | |||
if (is_null($this->recordsPerPage)) return null; | |||
$route = $request->route(); | |||
$query = $request->query(); | |||
$alias = $route[1]['as'] ?? 'index'; | |||
$params = $route[2] ?? []; | |||
$pages = array_map(function($page) use($alias, $params) { | |||
$pages = array_map(function($page) use($alias, $params, $query) { | |||
$currentPage = $params['page'] ?? 1; | |||
return (object) [ | |||
'number' => $page, | |||
'active' => ($page == $currentPage), | |||
'link' => route($alias, array_merge($params, ['page' => $page])) | |||
'link' => route($alias, array_merge($params, ['page' => $page])) //. $this->queryParams($query) | |||
]; | |||
}, range(1, $this->getPageCount())); | |||
@@ -23,4 +23,59 @@ class User { | |||
return $s; | |||
} | |||
private static function requestAll(int $page = 0, string $query = ''): Dataset | |||
{ | |||
$path = ['/users/']; | |||
if ($page > 0) $path[] = $page; | |||
$data = (new AbstractData)->httpGet(implode('', $path), ['filter' => $query]); | |||
$json = json_decode($data); | |||
$records = array_map(function($user) { | |||
return self::unwrap($user); | |||
}, $json->users); | |||
return (new Dataset($records)) | |||
->setTotalRecords($json->totalUsers) | |||
->setCurrentPage($page) | |||
->setRecordsPerPage(40); | |||
} | |||
public static function updateAll(int $page = 0, string $query = ''): Dataset | |||
{ | |||
$key = sprintf('users-%u-%s', $page, $query); | |||
$data = self::requestAll($page, $query); | |||
Cache::put($key, $data, 3600); | |||
return $data; | |||
} | |||
public static function all(int $page = 0, string $query = ''): Dataset | |||
{ | |||
$key = sprintf('users-%u-%s', $page, $query); | |||
return Cache::get($key, function() use($page, $query) { | |||
return self::updateAll($page, $query); | |||
}); | |||
} | |||
private static function requestOne(int $userId): Dataset | |||
{ | |||
$data = (new AbstractData)->httpGet(sprintf('/user/%s', $userId)); | |||
$json = json_decode($data); | |||
$record = self::unwrap($json); | |||
return (new Dataset($record)); | |||
} | |||
public static function updateOne(int $userId): Dataset | |||
{ | |||
$key = sprintf('user-%u', $userId); | |||
$data = self::requestOne($userId); | |||
Cache::put($key, $data, 3600); | |||
return $data; | |||
} | |||
public static function one(int $userId): Dataset | |||
{ | |||
$key = sprintf('user-%u', $userId); | |||
return Cache::get($key, function() use($userId) { | |||
return self::updateOne($userId); | |||
}); | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
@extends('default') | |||
@section('title', $user->username) | |||
@section('breadcrumb') | |||
<a href="{{ route('index') }}">Home</a> | |||
<a>></a> | |||
<a href="{{ route('users') }}">Users</a> | |||
<a>></a> | |||
<a href="{{ route('user', ['user' => $user->id]) }}">{{ $user->username }}</a> | |||
@endsection | |||
@section('content') | |||
@include('partial/user'); | |||
<div class="row spacer"></div> | |||
<div class="row"> | |||
<p>Will add bios later, probably</p> | |||
</div> | |||
@endsection | |||
@section('scripts') | |||
<link rel='stylesheet' type='text/css' href='/css/page/user.css'/> | |||
@endsection |
@@ -0,0 +1,34 @@ | |||
@extends('default') | |||
@section('title', 'Users') | |||
@section('breadcrumb') | |||
<a href="{{ route('index') }}">Home</a> | |||
<a>></a> | |||
<a href="{{ route('users') }}">Users</a> | |||
@endsection | |||
@section('content') | |||
<div class="row search input"> | |||
<form class="querybox" method="get"> | |||
<div class="inputwrapper"> | |||
<input type="text" name="query" value="{{ $query }}" placeholder="User Search"> | |||
</div> | |||
<div class="buttonwrapper"> | |||
<input type="submit" value="Search"> | |||
</div> | |||
</form> | |||
</div> | |||
<div class="row spacer"></div> | |||
{!! $paginator !!} | |||
@foreach($users as $user) | |||
@include('partial/user') | |||
<div class="row spacer"></div> | |||
@endforeach | |||
{!! $paginator !!} | |||
@endsection | |||
@section('scripts') | |||
<link rel='stylesheet' type='text/css' href='/css/page/user.css'/> | |||
<link rel='stylesheet' type='text/css' href='/css/page/search.css'/> | |||
@endsection |
@@ -0,0 +1,12 @@ | |||
<div class="row userInfo"> | |||
<div class="userBackground"> | |||
<img src="{{ $user->background }}"> | |||
</div> | |||
<div class="userForeground"> | |||
<img class="avatar" src="{{ $user->avatar }}"> | |||
<a class="username">{{ $user->username }}</a> | |||
<a class="link" href="{{ route('user.bans', ['user' => $user->id]) }}">Bans</a> | |||
<a class="link" href="{{ route('user.threads', ['user' => $user->id]) }}">Threads</a> | |||
<a class="link" href="{{ route('user.posts', ['user' => $user->id]) }}">Posts</a> | |||
</div> | |||
</div> |
@@ -53,9 +53,14 @@ $router->get('/events', [ | |||
]); | |||
// user profile | |||
$router->get('/users[/{page}]', [ | |||
'as' => 'users', | |||
'uses' => 'UserController@all' | |||
]); | |||
$router->get('/user/{user}', [ | |||
'as' => 'user', | |||
'uses' => 'UserController@get' | |||
'uses' => 'UserController@one' | |||
]); | |||
$router->get('/user/{user}/posts', [ | |||