add User /favorites, /statistics, /about endpoints

This commit is contained in:
Irfan 2020-09-13 13:18:36 +05:00
parent 2fd93e1a2b
commit a69ca6ff90
6 changed files with 282 additions and 6 deletions

View File

@ -103,6 +103,229 @@ class UserController extends Controller
);
}
/**
* @OA\Get(
* path="/users/{username}/statistics",
* operationId="getUserStatistics",
* tags={"users"},
*
* @OA\Response(
* response="200",
* description="Returns user statistics",
* @OA\JsonContent()
* ),
* @OA\Response(
* response="400",
* description="Error: Bad request. When required parameters were not supplied.",
* ),
* ),
*/
public function statistics(Request $request, string $username)
{
$username = strtolower($username);
$results = Profile::query()
->where('username', $username)
->get();
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$response = Profile::scrape($username);
if ($results->isEmpty()) {
$meta = [
'createdAt' => new UTCDateTime(),
'modifiedAt' => new UTCDateTime(),
'request_hash' => $this->fingerprint
];
}
$meta['modifiedAt'] = new UTCDateTime();
$response = $meta + $response;
if ($results->isEmpty()) {
Profile::query()
->insert($response);
}
if ($this->isExpired($request, $results)) {
Profile::query()
->where('username', $username)
->update($response);
}
$results = Profile::query()
->where('username', $username)
->get();
}
if ($results->isEmpty()) {
return HttpResponse::notFound($request);
}
$response = (new \App\Http\Resources\V4\ProfileStatisticsResource(
$results->first()
))->response();
return $this->prepareResponse(
$response,
$results,
$request
);
}
/**
* @OA\Get(
* path="/users/{username}/favorites",
* operationId="getUserFavorites",
* tags={"users"},
*
* @OA\Response(
* response="200",
* description="Returns user favorites",
* @OA\JsonContent()
* ),
* @OA\Response(
* response="400",
* description="Error: Bad request. When required parameters were not supplied.",
* ),
* ),
*/
public function favorites(Request $request, string $username)
{
$username = strtolower($username);
$results = Profile::query()
->where('username', $username)
->get();
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$response = Profile::scrape($username);
if ($results->isEmpty()) {
$meta = [
'createdAt' => new UTCDateTime(),
'modifiedAt' => new UTCDateTime(),
'request_hash' => $this->fingerprint
];
}
$meta['modifiedAt'] = new UTCDateTime();
$response = $meta + $response;
if ($results->isEmpty()) {
Profile::query()
->insert($response);
}
if ($this->isExpired($request, $results)) {
Profile::query()
->where('username', $username)
->update($response);
}
$results = Profile::query()
->where('username', $username)
->get();
}
if ($results->isEmpty()) {
return HttpResponse::notFound($request);
}
$response = (new \App\Http\Resources\V4\ProfileFavoritesResource(
$results->first()
))->response();
return $this->prepareResponse(
$response,
$results,
$request
);
}
/**
* @OA\Get(
* path="/users/{username}/about",
* operationId="getUserAbout",
* tags={"users"},
*
* @OA\Response(
* response="200",
* description="Returns user about (HTML)",
* @OA\JsonContent()
* ),
* @OA\Response(
* response="400",
* description="Error: Bad request. When required parameters were not supplied.",
* ),
* ),
*/
public function about(Request $request, string $username)
{
$username = strtolower($username);
$results = Profile::query()
->where('username', $username)
->get();
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$response = Profile::scrape($username);
if ($results->isEmpty()) {
$meta = [
'createdAt' => new UTCDateTime(),
'modifiedAt' => new UTCDateTime(),
'request_hash' => $this->fingerprint
];
}
$meta['modifiedAt'] = new UTCDateTime();
$response = $meta + $response;
if ($results->isEmpty()) {
Profile::query()
->insert($response);
}
if ($this->isExpired($request, $results)) {
Profile::query()
->where('username', $username)
->update($response);
}
$results = Profile::query()
->where('username', $username)
->get();
}
if ($results->isEmpty()) {
return HttpResponse::notFound($request);
}
$response = (new \App\Http\Resources\V4\ProfileAboutResource(
$results->first()
))->response();
return $this->prepareResponse(
$response,
$results,
$request
);
}
/**
* @OA\Get(
* path="/users/{username}/history/{type}",

View File

@ -0,0 +1,16 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\JsonResource;
class ProfileAboutResource extends JsonResource
{
public function toArray($request)
{
return [
'about' => $this->about
];
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\JsonResource;
class ProfileFavoritesResource extends JsonResource
{
public function toArray($request)
{
return $this->favorites;
}
}

View File

@ -268,12 +268,6 @@ class ProfileResource extends JsonResource
'birthday' => $this->birthday,
'location' => $this->location,
'joined' => $this->joined,
'statistics' => [
'anime' => $this->anime_stats,
'manga' => $this->manga_stats,
],
'favorites' => $this->favorites,
'about' => $this->about,
];
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\JsonResource;
class ProfileStatisticsResource extends JsonResource
{
public function toArray($request)
{
return [
'anime' => $this->anime_stats,
'manga' => $this->manga_stats,
];
}
}

View File

@ -280,6 +280,18 @@ $router->group(
'uses' => 'UserController@profile'
]);
$router->get('/statistics', [
'uses' => 'UserController@statistics'
]);
$router->get('/favorites', [
'uses' => 'UserController@favorites'
]);
$router->get('/about', [
'uses' => 'UserController@about'
]);
$router->get('/history[/{type:[A-Za-z]+}]', [
'uses' => 'UserController@history'
]);