Skip to content

Commit

Permalink
feat: user lists (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
djaiss authored Jan 9, 2024
1 parent 1a24932 commit a4b0674
Show file tree
Hide file tree
Showing 52 changed files with 1,473 additions and 127 deletions.
2 changes: 1 addition & 1 deletion app/Http/Controllers/FemaleNameController.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public function letter(Request $request): View
return Name::where('name', '!=', '_PRENOMS_RARES')
->where('gender', 'female')
->where('name', 'like', $requestedLetter . '%')
->orderBy('name', 'asc')
->orderBy('total', 'desc')
->paginate(40);
});

Expand Down
106 changes: 106 additions & 0 deletions app/Http/Controllers/ListController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?php

namespace App\Http\Controllers;

use App\Http\ViewModels\User\ListViewModel;
use App\Services\CreateList;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redirect;
use Illuminate\View\View;

class ListController extends Controller
{
public function index(): View
{
$lists = Cache::remember('user-lists-' . auth()->id(), 604800, function () {
return ListViewModel::index();
});

return view('user.lists.index', [
'lists' => $lists['lists'],
]);
}

public function store(Request $request): RedirectResponse
{
$list = (new CreateList(
name: $request->input('list-name'),
description: $request->input('description'),
isPublic: false,
canBeModified: true,
))->execute();

Cache::forget('route-list-' . $list->id);
Cache::forget('user-lists-' . auth()->id());

return Redirect::route('list.show', [
'liste' => $list->id,
]);
}

public function show(Request $request): View
{
$requestedList = $request->attributes->get('list');

$details = Cache::remember('list-details-' . $requestedList->id, 604800, function () use ($requestedList) {
return ListViewModel::show($requestedList);
});

return view('user.lists.show', [
'term' => null,
'list' => $details,
'search_items' => null,
]);
}

public function edit(Request $request): View
{
return view('user.lists.edit', [
'list' => ListViewModel::edit($request->attributes->get('list')),
]);
}

public function update(Request $request): RedirectResponse
{
$list = $request->attributes->get('list');

$list->name = $request->input('list-name');
$list->description = $request->input('description');
$list->save();

Cache::forget('route-list-' . $list->id);
Cache::forget('user-lists-' . auth()->id());
Cache::forget('list-details-' . $list->id);

return Redirect::route('list.show', [
'liste' => $list->id,
]);
}

public function destroy(Request $request): RedirectResponse
{
$list = $request->attributes->get('list');

$list->delete();

Cache::forget('route-list-' . $list->id);
Cache::forget('user-lists-' . auth()->id());
Cache::forget('list-details-' . $list->id);

return Redirect::route('list.index');
}

public function new(): View
{
return view('user.lists.new');
}

public function delete(Request $request): View
{
return view('user.lists.destroy', [
'list' => ListViewModel::delete($request->attributes->get('list')),
]);
}
}
62 changes: 62 additions & 0 deletions app/Http/Controllers/ListNameController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

namespace App\Http\Controllers;

use App\Http\ViewModels\User\ListViewModel;
use App\Services\ToggleNameToNameList;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\View;
use Mauricius\LaravelHtmx\Http\HtmxResponseClientRedirect;

class ListNameController extends Controller
{
public function index(Request $request): View
{
$requestedList = $request->attributes->get('list');

$details = Cache::remember('list-details-' . $requestedList->id, 604800, function () use ($requestedList) {
return ListViewModel::show($requestedList);
});

return view('user.lists.show', [
'list' => $details,
]);
}

/**
* Add or remove a name from the list
*/
public function store(Request $request, int $listId, int $nameId): Response
{
$requestedList = $request->attributes->get('list');

(new ToggleNameToNameList(
nameId: $nameId,
listId: $requestedList->id,
))->execute();

Cache::forget('route-list-' . $requestedList->id);
Cache::forget('user-lists-' . auth()->id());
Cache::forget('list-details-' . $requestedList->id);

return new HtmxResponseClientRedirect(route('list.show', [
'liste' => $requestedList->id,
]));
}

public function destroy(Request $request, int $listId, int $nameId): void
{
$requestedList = $request->attributes->get('list');

(new ToggleNameToNameList(
nameId: $nameId,
listId: $requestedList->id,
))->execute();

Cache::forget('route-list-' . $requestedList->id);
Cache::forget('user-lists-' . auth()->id());
Cache::forget('list-details-' . $requestedList->id);
}
}
29 changes: 29 additions & 0 deletions app/Http/Controllers/ListSearchController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Http\Controllers;

use App\Http\ViewModels\Search\SearchViewModel;
use App\Http\ViewModels\User\ListViewModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\View;

class ListSearchController extends Controller
{
public function index(Request $request): View
{
$requestedList = $request->attributes->get('list');

$details = Cache::remember('list-details-' . $requestedList->id, 604800, function () use ($requestedList) {
return ListViewModel::show($requestedList);
});

$names = SearchViewModel::names($request->input('term'));

return view('user.lists.partials.search-items', [
'term' => $request->input('term'),
'list' => $details,
'search_items' => $names,
]);
}
}
2 changes: 1 addition & 1 deletion app/Http/Controllers/MaleNameController.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public function letter(Request $request): View
return Name::where('name', '!=', '_PRENOMS_RARES')
->where('gender', 'male')
->where('name', 'like', $requestedLetter . '%')
->orderBy('name', 'asc')
->orderBy('total', 'desc')
->paginate(40);
});

Expand Down
96 changes: 96 additions & 0 deletions app/Http/Controllers/MixteNameController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php

namespace App\Http\Controllers;

use App\Http\ViewModels\Names\MixteNamesViewModel;
use App\Http\ViewModels\Names\NameViewModel;
use App\Http\ViewModels\User\UserViewModel;
use App\Models\Name;
use Illuminate\Http\Request;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
use Illuminate\View\View;

class MixteNameController extends Controller
{
public function index(Request $request): View
{
// get the page parameter from the url
$requestedPage = $request->query('page') ?? 1;

$letters = Cache::remember('all-letters-mixte', 604800, function () {
return MixteNamesViewModel::index();
});

Paginator::currentPageResolver(function () use ($requestedPage) {
return $requestedPage;
});

$namesPagination = Cache::remember('all-names-mixte-page-' . $requestedPage, 604800, function () {
return Name::where('name', '!=', '_PRENOMS_RARES')
->where('unisex', 1)
->orderBy('total', 'desc')
->paginate(40);
});

$names = $namesPagination
->map(fn (Name $name) => NameViewModel::summary($name));

if (! auth()->check()) {
$favoritedNamesForLoggedUser = collect();
} else {
$favoritedNamesForLoggedUser = Cache::remember('user-favorites-' . auth()->id(), 604800, function () {
return UserViewModel::favorites();
});
}

return view('names.mixte.index', [
'letters' => $letters,
'names' => $names,
'namesPagination' => $namesPagination,
'favorites' => $favoritedNamesForLoggedUser,
]);
}

public function letter(Request $request): View
{
$requestedLetter = $request->attributes->get('letter');
$requestedPage = $request->query('page') ?? 1;

$letters = Cache::remember('all-letters-mixte', 604800, function () {
return MixteNamesViewModel::index();
});

Paginator::currentPageResolver(function () use ($requestedPage) {
return $requestedPage;
});

$namesPagination = Cache::remember('mixte-letter-' . $requestedLetter . '-page-' . $requestedPage, 604800, function () use ($requestedLetter) {
return Name::where('name', '!=', '_PRENOMS_RARES')
->where('unisex', 1)
->where('name', 'like', $requestedLetter . '%')
->orderBy('total', 'desc')
->paginate(40);
});

$names = $namesPagination
->map(fn (Name $name) => NameViewModel::summary($name));

if (! auth()->check()) {
$favoritedNamesForLoggedUser = collect();
} else {
$favoritedNamesForLoggedUser = Cache::remember('user-favorites-' . auth()->id(), 604800, function () {
return UserViewModel::favorites();
});
}

return view('names.mixte.letter', [
'letters' => $letters,
'names' => $names,
'namesPagination' => $namesPagination,
'activeLetter' => Str::ucfirst($requestedLetter),
'favorites' => $favoritedNamesForLoggedUser,
]);
}
}
27 changes: 26 additions & 1 deletion app/Http/Controllers/NameController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

use App\Http\ViewModels\Names\AllNamesViewModel;
use App\Http\ViewModels\Names\NameViewModel;
use App\Http\ViewModels\User\ListViewModel;
use App\Http\ViewModels\User\UserViewModel;
use App\Models\Name;
use App\Services\ToggleNameToNameList;
use Illuminate\Http\Request;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Cache;
Expand Down Expand Up @@ -74,10 +76,13 @@ public function show(Request $request): View

if (! auth()->check()) {
$favoritedNamesForLoggedUser = collect();
$lists = [];
} else {
$favoritedNamesForLoggedUser = Cache::remember('user-favorites-' . auth()->id(), 604800, function () {
return UserViewModel::favorites();
});

$lists = ListViewModel::lists($requestedName);
}

return view('names.show', [
Expand All @@ -87,6 +92,7 @@ public function show(Request $request): View
'jsonLdSchema' => NameViewModel::jsonLdSchema($requestedName),
'numerology' => $numerology,
'favorites' => $favoritedNamesForLoggedUser,
'lists' => $lists,
]);
}

Expand All @@ -106,7 +112,7 @@ public function letter(Request $request): View
$namesPagination = Cache::remember('letter-' . $requestedLetter . '-page-' . $requestedPage, 604800, function () use ($requestedLetter) {
return Name::where('name', '!=', '_PRENOMS_RARES')
->where('name', 'like', $requestedLetter . '%')
->orderBy('name', 'asc')
->orderBy('total', 'desc')
->paginate(40);
});

Expand All @@ -129,4 +135,23 @@ public function letter(Request $request): View
'favorites' => $favoritedNamesForLoggedUser,
]);
}

public function storeNameInList(Request $request, int $listId, int $nameId): View
{
$requestedList = $request->attributes->get('list');

(new ToggleNameToNameList(
nameId: $nameId,
listId: $requestedList->id,
))->execute();

Cache::forget('list-details-' . $requestedList->id);
Cache::forget('user-lists-' . auth()->id());

$list = ListViewModel::getListDetail($requestedList, Name::find($nameId));

return view('names.partials.lists', [
'list' => $list,
]);
}
}
Loading

0 comments on commit a4b0674

Please sign in to comment.