This commit is contained in:
User
2024-12-31 20:17:35 -05:00
parent 3a1d4cc40a
commit 9777e46316
10 changed files with 13376 additions and 58 deletions

13101
app/Helper/ZhConversion.php Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2,17 +2,18 @@
namespace App\Http\Controllers;
use App\Helper\ZhConversion;
use App\Models\Author;
use App\Models\Chapter;
use App\Models\Comic;
use App\Models\Image;
use App\Remote\CopyManga;
use App\Remote\ImageFetcher;
use Exception;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Application;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
@@ -24,19 +25,42 @@ use Inertia\Response;
class ComicController extends Controller
{
public function __construct(private readonly CopyManga $copyManga)
public function __construct(private readonly CopyManga $copyManga, private readonly ZhConversion $zhConversion)
{
}
public function favourites(Request $request)
protected function scToZh(mixed $string): mixed
{
$favourites = $request->user()->favourites()->with(['authors'])->orderBy('upstream_updated_at', 'desc')->get();
if (gettype($string) !== 'string') {
$string = serialize($string);
return unserialize(str_replace(array_keys($this->zhConversion::ZH_TO_HANT), array_values($this->zhConversion::ZH_TO_HANT), $string));
}
return str_replace(array_keys($this->zhConversion::ZH_TO_HANT), array_values($this->zhConversion::ZH_TO_HANT), $string);
}
/**
* Show user favourites
*
* @param Request $request
* @return Response
*/
public function favourites(Request $request): Response
{
$favourites = $this->scToZh($request->user()->favourites()->with(['authors'])->orderBy('upstream_updated_at', 'desc')->get());
return Inertia::render('Comic/Favourites', [
'favourites' => $favourites,
]);
}
/**
* Toggle user favourites
*
* @param Request $request
* @return JsonResponse
* @throws GuzzleException
*/
public function postFavourite(Request $request): JsonResponse
{
try {
@@ -68,6 +92,14 @@ class ComicController extends Controller
return response()->json($request->user()->favourites()->get(['pathword'])->pluck('pathword'));
}
/**
* Show image via proxy
*
* @param Request $request
* @param string $url
* @return ResponseFactory|Application|IlluminateHttpResponse
* @throws ConnectionException
*/
public function image(Request $request, string $url): ResponseFactory|Application|IlluminateHttpResponse
{
// TODO: Ref check and make it require auth
@@ -121,7 +153,7 @@ class ComicController extends Controller
}
/**
*
* Index / Tags for comic listing
*
* @param Request $request
* @return Response
@@ -138,11 +170,19 @@ class ComicController extends Controller
$this->comicsUpsert($comics);
return Inertia::render('Comic/Index', [
'comics' => $comics,
'comics' => $this->scToZh($comics),
'offset' => $request->header('offset', 0)
]);
}
/**
* Author for comic listing
*
* @param Request $request
* @param string $author
* @return Response
* @throws GuzzleException
*/
public function author(Request $request, string $author): Response
{
$params = [];
@@ -152,11 +192,19 @@ class ComicController extends Controller
$this->comicsUpsert($comics);
return Inertia::render('Comic/Index', [
'comics' => $comics,
'comics' => $this->scToZh($comics),
'offset' => $request->header('offset', 0)
]);
}
/**
* Search for comic listing
*
* @param Request $request
* @param string $search
* @return Response
* @throws GuzzleException
*/
public function search(Request $request, string $search): Response
{
$comics = $this->copyManga->search($search, 30, $request->header('offset', 0));
@@ -164,13 +212,25 @@ class ComicController extends Controller
// Search API is limited, no upsert
return Inertia::render('Comic/Index', [
'comics' => $comics,
'comics' => $this->scToZh($comics),
'offset' => $request->header('offset', 0)
]);
}
public function chapters(Request $request, string $pathword = ''): Response
/**
* Show comic details and chapters
*
* @param Request $request
* @param string $pathword
* @return RedirectResponse|Response
* @throws GuzzleException
*/
public function chapters(Request $request, string $pathword = ''): RedirectResponse|Response
{
if ($pathword === 'installHook.js.map') {
return to_route('comics.index');
}
$comic = $this->copyManga->comic($pathword);
$chapters = $this->copyManga->chapters($pathword, 200, $request->header('offset', 0), [], $request->get('group', 'default'));
@@ -228,13 +288,22 @@ class ComicController extends Controller
->distinct()->select('chapter_uuid')->get()->pluck('chapter_uuid');
return Inertia::render('Comic/Chapters', [
'comic' => $comic,
'chapters' => $chapters,
'comic' => $this->scToZh($comic),
'chapters' => $this->scToZh($chapters),
'histories' => $histories,
'offset' => $request->header('offset', 0)
]);
}
/**
* Read a chapter, showing images
*
* @param Request $request
* @param string $pathword
* @param string $uuid
* @return Response
* @throws GuzzleException
*/
public function read(Request $request, string $pathword = '', string $uuid = ''): Response
{
$comic = $this->copyManga->comic($pathword);
@@ -277,11 +346,17 @@ class ComicController extends Controller
$request->user()->readingHistories()->attach($chapterObj->id, ['comic_id' => $comicObj->id]);
return Inertia::render('Comic/Read', [
'comic' => $comic,
'chapter' => $chapter,
'comic' => $this->scToZh($comic),
'chapter' => $this->scToZh($chapter),
]);
}
/**
* Show user read histories
*
* @param Request $request
* @return Response
*/
public function histories(Request $request): Response
{
// Get history
@@ -289,10 +364,16 @@ class ComicController extends Controller
->select(['reading_histories.id as hid', 'reading_histories.created_at as read_at', 'chapters.comic_id', 'chapters.name'])->paginate(50)->toArray();
return Inertia::render('Comic/Histories', [
'histories' => $histories
'histories' => $this->scToZh($histories)
]);
}
/**
* Delete user read histories by submitting ids
*
* @param Request $request
* @return RedirectResponse
*/
public function destroyHistories(Request $request): RedirectResponse
{
if (!is_array($request->get('ids')) && $request->get('ids') === 'all') {
@@ -304,10 +385,17 @@ class ComicController extends Controller
return redirect()->route('comics.histories');
}
/**
* Fetch tags
*
* @return JsonResponse
* @throws GuzzleException
*/
public function tags()
{
// TODO
$tags = $this->copyManga->tags();
$tags = $this->scToZh($this->copyManga->tags());
Cache::forever('tags', $tags);
return response()->json($tags);

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;
use Inertia\Inertia;
use Inertia\Response;
class PagesController
{
/**
* @param Request $request
* @param string $path
* @return ResponseFactory|Application|\Illuminate\Http\Response|Response
*/
public function show(Request $request, string $path = '')
{
if (!File::exists(resource_path("js/Pages/Pages/$path.jsx"))) {
return response('Page not found', 404);
}
return Inertia::render("Pages/{$path}");
}
}