feat/factory_creation (#1)
Prepping for launch. Reviewed-on: #1 Co-authored-by: Paul Couture <paul@paulcouture.com> Co-committed-by: Paul Couture <paul@paulcouture.com>
This commit was merged in pull request #1.
This commit is contained in:
@@ -3,6 +3,9 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Artist;
|
||||
use App\Models\Artwork;
|
||||
use App\Models\Podcast;
|
||||
use App\Models\Episode;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ArtistController extends Controller
|
||||
@@ -14,7 +17,18 @@ class ArtistController extends Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
//
|
||||
$user = auth()->user();
|
||||
$artists = Artist::whereHas('artworks')
|
||||
->withCount('artworks')
|
||||
->orderBy('artworks_count', 'desc')
|
||||
->paginate(100);
|
||||
$podcasts = Podcast::where('published', true)->with('episodes')->get();
|
||||
return view('profile.artists', [
|
||||
'user' => $user,
|
||||
'pageTitle' => 'Artists',
|
||||
'podcasts' => $podcasts,
|
||||
'artists' => $artists,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -44,9 +58,23 @@ class ArtistController extends Controller
|
||||
* @param \App\Models\Artist $artist
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Artist $artist)
|
||||
public function show(Request $request, $slug)
|
||||
{
|
||||
//
|
||||
$user = auth()->user();
|
||||
$artist = Artist::where('slug', $slug)
|
||||
->firstOrFail();
|
||||
$artworks = Artwork::where('artist_id', $artist->id)
|
||||
->with('episode')
|
||||
->with('podcast')
|
||||
->orderBy('artworks.created_at', 'desc')
|
||||
->paginate($perPage = 92, $columns = ['*'], $pageName = 'artworks');
|
||||
$podcasts = Podcast::where('published', true)->with('episodes')->get();
|
||||
return view('profile.artist', [
|
||||
'user' => $user,
|
||||
'artist' => $artist,
|
||||
'artworks' => $artworks,
|
||||
'podcasts' => $podcasts,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,7 +3,18 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Artwork;
|
||||
use App\Models\Podcast;
|
||||
use App\Models\Episode;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Validation\Rules\File;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Str;
|
||||
use Intervention\Image\Facades\Image;
|
||||
use ImageOptimizer;
|
||||
|
||||
class ArtworkController extends Controller
|
||||
{
|
||||
@@ -14,7 +25,19 @@ class ArtworkController extends Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
//
|
||||
$user = auth()->user();
|
||||
$artworks = Artwork::whereNotNull('approved_by')
|
||||
->with('artist')
|
||||
->orderBy('episode_id', 'desc')
|
||||
->orderBy('created_at', 'desc')
|
||||
->paginate($perPage = 3, $columns = ['*'], $pageName = 'artworks');
|
||||
$podcasts = Podcast::where('published', true)->with('episodes')->get();
|
||||
return view('explore.artworks', [
|
||||
'user' => $user,
|
||||
'pageTitle' => 'Explore',
|
||||
'artworks' => $artworks,
|
||||
'podcasts' => $podcasts,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -24,7 +47,13 @@ class ArtworkController extends Controller
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
$user = auth()->user();
|
||||
$podcasts = Podcast::where('published', true)->with('episodes')->get();
|
||||
return view('artworks.submit', [
|
||||
'user' => $user,
|
||||
'pageTitle' => 'Submit New Artwork',
|
||||
'podcasts' => $podcasts,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -33,20 +62,79 @@ class ArtworkController extends Controller
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
//
|
||||
$validator = Validator::make($request->all(), [
|
||||
'title' => ['required', 'max:255',],
|
||||
'podcast' => ['required', 'exists:podcasts,id',],
|
||||
'description' => ['nullable',],
|
||||
'file' => ['required', 'image', Rule::dimensions()->ratio(1)->minWidth(512),],
|
||||
]);
|
||||
if ($validator->fails()) {
|
||||
return back()
|
||||
->withErrors($validator)
|
||||
->withInput();
|
||||
}
|
||||
Log::channel('artwork_import')->info('making new artwork model.');
|
||||
$podcast = Podcast::where('id', $request->podcast)->with(['episodes' => function($query) {
|
||||
$query->orderBy('episode_number', 'desc')->limit(1);
|
||||
}])->first();
|
||||
$episode = $podcast->episodes->first();
|
||||
$artist = auth()->user()->artists()->first();
|
||||
$rawFile = $request->file('file');
|
||||
$filename = now()->format('Y')
|
||||
. '/'
|
||||
. now()->format('m')
|
||||
. '/'
|
||||
. Str::slug($artist->name)
|
||||
. '-'
|
||||
. Str::slug($request->title)
|
||||
. '_'
|
||||
. Str::random(8)
|
||||
. '.jpg';
|
||||
$artwork = Artwork::factory()->state([
|
||||
'title' => $request->title,
|
||||
'artist_id' => $artist->id,
|
||||
'description' => $request->description,
|
||||
'overlay_id' => null,
|
||||
'podcast_id' => $podcast->id,
|
||||
'episode_id' => $episode->id,
|
||||
'filename' => $filename,
|
||||
])->create();
|
||||
$img = Image::make($rawFile)->resize(3000, null, function($constraint){
|
||||
$constraint->aspectRatio();
|
||||
})
|
||||
->encode('jpg', 100)
|
||||
->save(Storage::disk('static')->path('/artworks') . '/' . $artwork->filename);
|
||||
$thumbImg = Image::make($request->file('file'))->resize(512, null, function($constraint){
|
||||
$constraint->aspectRatio();
|
||||
})
|
||||
->encode('jpg', 100)
|
||||
->save(Storage::disk('static')->path('/thumbnails') . '/' . $artwork->filename);
|
||||
ImageOptimizer::optimize(Storage::disk('static')->path('/artworks/' . $artwork->filename));
|
||||
ImageOptimizer::optimize(Storage::disk('static')->path('/thumbnails/' . $artwork->filename));
|
||||
return redirect('/artworks/' . $artwork->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param \App\Models\Artwork $artwork
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param the id of the \App\Models\Artwork $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Artwork $artwork)
|
||||
public function show(Request $request, $id)
|
||||
{
|
||||
//
|
||||
$user = auth()->user();
|
||||
$artwork = Artwork::where('id', $id)
|
||||
->with('podcast')
|
||||
->with('episode')
|
||||
->with('artist')
|
||||
->first();
|
||||
return view('artworks.artwork', [
|
||||
'artwork' => $artwork,
|
||||
'user' => $user,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,4 +170,11 @@ class ArtworkController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
public function legacyArtLink(Request $request, $any = null)
|
||||
{
|
||||
phpinfo();
|
||||
dd($request->path());
|
||||
//$artwork = Artwork::where('legacy_filename', '/assets/artwork/')
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,10 +4,12 @@ namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\User;
|
||||
use App\Models\Artist;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Auth\Events\Registered;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Validation\Rules;
|
||||
@@ -31,17 +33,24 @@ class RegisteredUserController extends Controller
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'name' => ['required', 'string', 'max:255'],
|
||||
'name' => ['unique:artists,name', 'required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:'.User::class],
|
||||
'password' => ['required', 'confirmed', Rules\Password::defaults()],
|
||||
]);
|
||||
|
||||
$user = User::create([
|
||||
'name' => $request->name,
|
||||
'email' => $request->email,
|
||||
'name' => trim($request->name),
|
||||
'email' => trim(strtolower($request->email)),
|
||||
'password' => Hash::make($request->password),
|
||||
]);
|
||||
|
||||
$artist = Artist::create([
|
||||
'user_id' => $user->id,
|
||||
'name' => trim($request->name),
|
||||
'slug' => Str::slug(trim($request->name)),
|
||||
'location' => 'No Agenda Nation',
|
||||
]);
|
||||
|
||||
event(new Registered($user));
|
||||
|
||||
Auth::login($user);
|
||||
|
||||
@@ -2,8 +2,12 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Episode;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Models\Podcast;
|
||||
use App\Models\Artworks;
|
||||
use App\Models\Episode;
|
||||
|
||||
class EpisodeController extends Controller
|
||||
{
|
||||
@@ -44,9 +48,26 @@ class EpisodeController extends Controller
|
||||
* @param \App\Models\Episode $episode
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Episode $episode)
|
||||
public function show(Request $request, $podcast_slug, $slug)
|
||||
{
|
||||
//
|
||||
$user = auth()->user();
|
||||
$episode = Episode::where('slug', $slug)
|
||||
->with('artworks')
|
||||
->with('artwork')
|
||||
->with('podcast')
|
||||
->firstOrFail();
|
||||
$podcasts = Podcast::where('published', true)->with('episodes', function ($query) {
|
||||
$query->orderBy('episode_number', 'desc');
|
||||
$query->where('published', true);
|
||||
$query->take(10);
|
||||
})->get();
|
||||
return view('episodes.episode', [
|
||||
'user' => $user,
|
||||
'pageTitle' => '"' . $episode->title . '" ' . $episode->podcast->name . ' Episode ' . number_format($episode->episode_number + 0),
|
||||
'podcast' => $episode->podcast,
|
||||
'episode' => $episode,
|
||||
'podcasts' => $podcasts,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
144
site/app/Http/Controllers/PageController.php
Normal file
144
site/app/Http/Controllers/PageController.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Models\Artwork;
|
||||
use App\Models\Artist;
|
||||
use App\Models\Episode;
|
||||
|
||||
|
||||
class PageController extends Controller
|
||||
{
|
||||
public function landing(Request $request)
|
||||
{
|
||||
$user = auth()->user();
|
||||
$headerCounters = $this->getHeaderCounters();
|
||||
$recentEpisodes = $this->mostRecentEpisodes();
|
||||
$recentSubmissions = $this->mostRecentSubmissions();
|
||||
$leaderboard = $this->leaderboardTwelveMonths();
|
||||
|
||||
return view('home.page', [
|
||||
'user' => $user,
|
||||
'pageTitle' => 'Home',
|
||||
'headerCounters' => $headerCounters,
|
||||
'recentEpisodes' => $recentEpisodes,
|
||||
'recentSubmissions' => $recentSubmissions,
|
||||
'leaderboard' => $leaderboard,
|
||||
'preferredTheme' => $request->session()->get('preferred_theme') ?? 'dark',
|
||||
]);
|
||||
}
|
||||
|
||||
private function mostRecentSubmissions() {
|
||||
$artworks = Cache::remember('latestSubmissions', 30, function() {
|
||||
return Artwork::whereNotNull('approved_by')
|
||||
->with('artist')
|
||||
->with('episode')
|
||||
->with('podcast')
|
||||
->orderBy('created_at', 'desc')
|
||||
->limit(50)
|
||||
->get();
|
||||
});
|
||||
return $artworks;
|
||||
}
|
||||
|
||||
private function mostRecentEpisodes()
|
||||
{
|
||||
$episodes = Cache::remember('latestEpisodes', 30, function() {
|
||||
return Episode::where('published', true)
|
||||
->whereHas('artwork')
|
||||
->with('podcast')
|
||||
->with('artwork')
|
||||
->with('artwork.artist')
|
||||
->orderBy('episode_date', 'desc')
|
||||
->limit(10)
|
||||
->get();
|
||||
});
|
||||
return $episodes;
|
||||
}
|
||||
|
||||
private function getHeaderCounters()
|
||||
{
|
||||
$headerCounters = [];
|
||||
$artworkCountNumber = Cache::remember('artworkCountNumber', 10, function() {
|
||||
return Artwork::all()->count();
|
||||
});
|
||||
$artistCountNumber = Cache::remember('artistCountNumber', 10, function() {
|
||||
return Artist::all()->count();
|
||||
});
|
||||
$episodeCountNumber = Cache::remember('episodeCountNumber', 10, function() {
|
||||
return Episode::all()->count();
|
||||
});
|
||||
$headerCounters['Artworks'] = $this->shortNumberCount($artworkCountNumber);
|
||||
$headerCounters['Artists'] = $this->shortNumberCount($artistCountNumber);
|
||||
$headerCounters['Episodes'] = $this->shortNumberCount($episodeCountNumber);
|
||||
return $headerCounters;
|
||||
}
|
||||
private function shortNumberCount($number)
|
||||
{
|
||||
$units = ['', 'K', 'M', 'B', 'T'];
|
||||
for ($i = 0; $number >= 1000; $i++) {
|
||||
$number /= 1000;
|
||||
}
|
||||
return [
|
||||
'number' => $this->numberFormatPrecision($number, 1), //number_format(floatval($number), 1),
|
||||
'unit' => $units[$i],
|
||||
];
|
||||
}
|
||||
|
||||
private function numberFormatPrecision($number, $precision = 2, $separator = '.')
|
||||
{
|
||||
$numberParts = explode($separator, $number);
|
||||
$response = $numberParts[0];
|
||||
if (count($numberParts)>1 && $precision > 0) {
|
||||
$response .= $separator;
|
||||
$response .= substr($numberParts[1], 0, $precision);
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
private function leaderboardTwelveMonths() {
|
||||
$endDate = now()->endOfDay()->subYear()->format('Y-m-d');
|
||||
$leaderboard = DB::table('episodes')
|
||||
->join('artworks', 'artworks.id', '=', 'episodes.artwork_id')
|
||||
->join('artists', 'artists.id', '=', 'artworks.artist_id')
|
||||
->select([
|
||||
DB::raw('artists.id as artistId'),
|
||||
DB::raw('artists.name as artistName'),
|
||||
DB::raw('count(artworks.id) as artworkCount')
|
||||
])
|
||||
->where('episodes.published', 1)
|
||||
->where('episodes.episode_date', '>=', $endDate)
|
||||
->groupBy('artistId')
|
||||
->orderByDesc('artworkCount')
|
||||
->limit(10)
|
||||
->get();
|
||||
$leaderboard = $this->addArtistModelToLeaderboard($leaderboard);
|
||||
return $leaderboard;
|
||||
}
|
||||
|
||||
private function addArtistModelToLeaderboard($leaderboard) {
|
||||
$artistIds = [];
|
||||
foreach ($leaderboard as $lb) {
|
||||
$artistIds[] = $lb->artistId;
|
||||
}
|
||||
$artists = Artist::whereIn('id', $artistIds)->get();
|
||||
foreach ($leaderboard as $lb) {
|
||||
$lb->artist = $artists->where('id', $lb->artistId)->first();
|
||||
}
|
||||
$p = 0;
|
||||
foreach ($leaderboard as $lb) {
|
||||
$p++;
|
||||
$lb->position = $p;
|
||||
}
|
||||
return $leaderboard;
|
||||
}
|
||||
|
||||
public function setSessionTheme(Request $request) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,8 +3,34 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Models\Podcast;
|
||||
use App\Models\Artworks;
|
||||
use App\Models\Episode;
|
||||
|
||||
|
||||
class PodcastController extends Controller
|
||||
{
|
||||
//
|
||||
public function show(Request $request, $slug)
|
||||
{
|
||||
$user = auth()->user();
|
||||
$podcast = Podcast::where('slug', $slug)
|
||||
->where('published', true)
|
||||
->firstOrFail();
|
||||
$episodes = Episode::where('published', true)
|
||||
->whereNotNull('artwork_id')
|
||||
->with('artwork')
|
||||
->with('artworks')
|
||||
->where('podcast_id', $podcast->id)
|
||||
->orderBy('episode_number', 'desc')->paginate(100);
|
||||
$podcasts = Podcast::where('published', true)->with('episodes')->get();
|
||||
return view('podcasts.podcast', [
|
||||
'user' => $user,
|
||||
'pageTitle' => $podcast->name,
|
||||
'podcast' => $podcast,
|
||||
'episodes' => $episodes,
|
||||
'podcasts' => $podcasts,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user