myvideogamelist.com/app/Http/Controllers/GameController.php

289 lines
9.5 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers;
use App\Models\Game;
use App\Rules\GameReleaseDate;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rule;
class GameController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
// Direct the user to the list of games.
return view('pages.admin.games.index');
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
// Direct the user to the add game to database page.
return view('pages.admin.games.create');
}
/**
* Show the form for cloning a resource.
*
* @param int $gameId
* @return \Illuminate\Http\Response
*/
public function clone($gameId)
{
// Direct the user to the clone game page.
$game = Game::findOrFail($gameId);
return view('pages.admin.games.clone', compact('game'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
// Ensure the user has permission to add games into the database.
$this->authorize('create', Game::class);
// Validate the data from the request.
$inputs = $this->validate($request, [
'name' => 'string|required|max:255',
'alt_titles' => 'string|nullable|max:255',
'platform_id' => 'integer|required',
'description' => 'string|nullable',
'source' => 'url|nullable|max:255',
'boxart' => 'image|nullable|max:512',
'genre_ids' => 'array|nullable',
'developers' => 'string|nullable|max:255',
'publishers' => 'string|nullable|max:255',
'composers' => 'string|nullable|max:255',
'website' => 'url|nullable|max:255',
'na_release_date' => [
new GameReleaseDate(),
'nullable'
],
'jp_release_date' => [
new GameReleaseDate(),
'nullable'
],
'eu_release_date' => [
new GameReleaseDate(),
'nullable'
],
'aus_release_date' => [
new GameReleaseDate(),
'nullable'
],
'esrb_rating' => [
'string',
'nullable',
Rule::in(['Everyone', 'Everyone 10+', 'Teen', 'Mature 17+', 'Adults Only 18+', 'Rating Pending - Likely Mature 17+']) // phpcs:ignore
],
'pegi_rating' => [
'string',
'nullable',
Rule::in(['PEGI 3', 'PEGI 7', 'PEGI 12', 'PEGI 16', 'PEGI 18'])
],
'cero_rating' => [
'string',
'nullable',
Rule::in(['CERO A', 'CERO B', 'CERO C', 'CERO D', 'CERO Z'])
],
'acb_rating' => [
'string',
'nullable',
Rule::in(['E', 'G', 'PG', 'M', 'MA 15+', 'R 18+', 'X 18+'])
]
]);
// Convert the genre_ids array into a comma separated string.
if (isset($inputs['genre_ids'])) {
$inputs['genre_ids'] = implode(',', $inputs['genre_ids']);
}
// Upload the boxart image as necessary.
if ($request->hasFile('boxart')) {
$path = $request->boxart->store('assets/boxart', 's3');
$inputs['boxart'] = basename($path);
}
// Set the requested_by and added_by fields to the current user.
$inputs['requested_by'] = auth()->user()->id;
$inputs['added_by'] = auth()->user()->id;
// Save the data to the database.
$result = Game::create($inputs);
// If the creation was successful go to the list of games.
if ($result->exists) {
return redirect('/admin/games')->with('create_success', str_replace('"', '', json_encode($inputs['name'])));
} else { // If the creation failed, go back.
return back();
}
}
/**
* Display the specified resource.
*
* @param int $gameId
*
* @return \Illuminate\Http\Response
*/
public function show($gameId)
{
// Direct the user to the games profile page.
$game = Game::findOrFail($gameId);
return view('pages.game.index', compact('game'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Game $game
* @return \Illuminate\Http\Response
*/
public function edit(Game $game)
{
// Direct the user to the edit game page.
$game = Game::findOrFail($game->id);
return view('pages.admin.games.edit', compact('game'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Game $game
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Game $game)
{
// Ensure the user has permission to add games into the database.
$this->authorize('update', Game::class);
// Validate the data from the request.
$inputs = $this->validate($request, [
'name' => 'string|required|max:255',
'alt_titles' => 'string|nullable|max:255',
'platform_id' => 'integer|required',
'description' => 'string|nullable',
'source' => 'url|nullable|max:255',
'boxart' => 'image|nullable|max:512',
'genre_ids' => 'array|nullable',
'developers' => 'string|nullable|max:255',
'publishers' => 'string|nullable|max:255',
'composers' => 'string|nullable|max:255',
'website' => 'url|nullable|max:255',
'na_release_date' => [
new GameReleaseDate(),
'nullable'
],
'jp_release_date' => [
new GameReleaseDate(),
'nullable'
],
'eu_release_date' => [
new GameReleaseDate(),
'nullable'
],
'aus_release_date' => [
new GameReleaseDate(),
'nullable'
],
'esrb_rating' => [
'string',
'nullable',
Rule::in(['Everyone', 'Everyone 10+', 'Teen', 'Mature 17+', 'Adults Only 18+', 'Rating Pending - Likely Mature 17+']) // phpcs:ignore
],
'pegi_rating' => [
'string',
'nullable',
Rule::in(['PEGI 3', 'PEGI 7', 'PEGI 12', 'PEGI 16', 'PEGI 18'])
],
'cero_rating' => [
'string',
'nullable',
Rule::in(['CERO A', 'CERO B', 'CERO C', 'CERO D', 'CERO Z'])
],
'acb_rating' => [
'string',
'nullable',
Rule::in(['E', 'G', 'PG', 'M', 'MA 15+', 'R 18+', 'X 18+'])
]
]);
// Convert the genre_ids array into a comma separated string.
if (isset($inputs['genre_ids'])) {
$inputs['genre_ids'] = implode(',', $inputs['genre_ids']);
$game->genre_ids = $inputs['genre_ids'];
}
// Upload the new boxart image as necessary.
if ($request->hasFile('boxart')) {
// Get the current boxart image.
$original_boxart = $game->boxart;
// Delete the boxart image if a previous boxart image existed.
if ($original_boxart) {
$result = Storage::disk('s3')->delete('assets/boxart/' . $original_boxart);
}
// Upload the new boxart image.
$path = $request->boxart->store('assets/boxart', 's3');
$inputs['boxart'] = basename($path);
$game->boxart = $inputs['boxart'];
}
// Set the values of the $game object to the new values.
$game->name = $inputs['name'];
$game->alt_titles = $inputs['alt_titles'];
$game->platform_id = $inputs['platform_id'];
$game->description = $inputs['description'];
$game->source = $inputs['source'];
$game->developers = $inputs['developers'];
$game->publishers = $inputs['publishers'];
$game->composers = $inputs['composers'];
$game->website = $inputs['website'];
$game->na_release_date = $inputs['na_release_date'];
$game->jp_release_date = $inputs['jp_release_date'];
$game->eu_release_date = $inputs['eu_release_date'];
$game->aus_release_date = $inputs['aus_release_date'];
$game->esrb_rating = $inputs['esrb_rating'];
$game->pegi_rating = $inputs['pegi_rating'];
$game->cero_rating = $inputs['cero_rating'];
$game->acb_rating = $inputs['acb_rating'];
// Save the data to the database.
$result = $game->save();
// If the update was successful show the user the updated game.
if ($result === true) {
return redirect('/admin/game/' . $game->id . '/edit')->with('edit_success', '1');
} else { // If the update failed, go back.
return back();
}
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Game $game
* @return \Illuminate\Http\Response
*/
public function destroy(Game $game)
{
//
}
}