155 lines
4.5 KiB
PHP
155 lines
4.5 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Dashboard Controller
|
|
* Professional Resume Builder - Main Dashboard
|
|
*
|
|
* @author David Valera Melendez <david@valera-melendez.de>
|
|
* @created 2025-08-08
|
|
* @location Made in Germany 🇩🇪
|
|
*/
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Interfaces\UserRepositoryInterface;
|
|
use App\Interfaces\ResumeRepositoryInterface;
|
|
use App\Services\ResumeService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\View\View;
|
|
|
|
/**
|
|
* Dashboard Controller
|
|
* Handles the main dashboard functionality with repository pattern
|
|
*/
|
|
class DashboardController extends Controller
|
|
{
|
|
/**
|
|
* User repository instance
|
|
*/
|
|
protected UserRepositoryInterface $userRepository;
|
|
|
|
/**
|
|
* Resume repository instance
|
|
*/
|
|
protected ResumeRepositoryInterface $resumeRepository;
|
|
|
|
/**
|
|
* Resume service instance
|
|
*/
|
|
protected ResumeService $resumeService;
|
|
|
|
/**
|
|
* Create a new controller instance with dependency injection
|
|
*/
|
|
public function __construct(
|
|
UserRepositoryInterface $userRepository,
|
|
ResumeRepositoryInterface $resumeRepository,
|
|
ResumeService $resumeService
|
|
) {
|
|
$this->userRepository = $userRepository;
|
|
$this->resumeRepository = $resumeRepository;
|
|
$this->resumeService = $resumeService;
|
|
$this->middleware('auth');
|
|
}
|
|
|
|
/**
|
|
* Show the application dashboard
|
|
*/
|
|
public function index(): View
|
|
{
|
|
$user = Auth::user();
|
|
|
|
// Get user's resumes using repository
|
|
$resumes = $this->resumeRepository->getUserResumes($user->id);
|
|
|
|
// Get resume statistics using repository
|
|
$resumeStats = $this->resumeRepository->getResumeStatistics($user->id);
|
|
|
|
// Get recent resumes (last 5)
|
|
$recentResumes = $this->resumeRepository
|
|
->orderBy('updated_at', 'desc')
|
|
->limit(5)
|
|
->getUserResumes($user->id);
|
|
|
|
// Calculate profile completion
|
|
$profileCompletion = $this->calculateProfileCompletion($user);
|
|
|
|
return view('dashboard.index', [
|
|
'title' => 'Dashboard - Professional Resume Builder',
|
|
'user' => $user,
|
|
'resumes' => $resumes,
|
|
'resumeStats' => $resumeStats,
|
|
'recentResumes' => $recentResumes,
|
|
'profileCompletion' => $profileCompletion,
|
|
'stats' => [
|
|
'total_resumes' => $resumeStats['total_resumes'],
|
|
'published_resumes' => $resumeStats['published_resumes'],
|
|
'draft_resumes' => $resumeStats['draft_resumes'],
|
|
'completed_resumes' => $resumeStats['completed_resumes'],
|
|
'avg_completion' => $resumeStats['avg_completion'],
|
|
'total_views' => $resumeStats['total_views'],
|
|
'total_downloads' => $resumeStats['total_downloads'],
|
|
'profile_completion' => $profileCompletion
|
|
]
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Calculate profile completion percentage
|
|
*/
|
|
private function calculateProfileCompletion($user): int
|
|
{
|
|
$requiredFields = [
|
|
'first_name', 'last_name', 'email', 'phone',
|
|
'bio', 'website', 'linkedin'
|
|
];
|
|
|
|
$completed = 0;
|
|
foreach ($requiredFields as $field) {
|
|
if (!empty($user->$field)) {
|
|
$completed++;
|
|
}
|
|
}
|
|
|
|
return (int) (($completed / count($requiredFields)) * 100);
|
|
}
|
|
|
|
/**
|
|
* Get dashboard analytics data
|
|
*/
|
|
public function analytics(): \Illuminate\Http\JsonResponse
|
|
{
|
|
$user = Auth::user();
|
|
|
|
$analytics = [
|
|
'user_stats' => $this->userRepository->getUserStatistics(),
|
|
'resume_stats' => $this->resumeRepository->getResumeStatistics($user->id),
|
|
'recent_activity' => $this->getRecentActivity($user->id),
|
|
];
|
|
|
|
return response()->json($analytics);
|
|
}
|
|
|
|
/**
|
|
* Get recent user activity
|
|
*/
|
|
private function getRecentActivity(int $userId): array
|
|
{
|
|
$recentResumes = $this->resumeRepository
|
|
->orderBy('updated_at', 'desc')
|
|
->limit(10)
|
|
->getUserResumes($userId);
|
|
|
|
return $recentResumes->map(function ($resume) {
|
|
return [
|
|
'id' => $resume->id,
|
|
'title' => $resume->title,
|
|
'action' => 'updated',
|
|
'timestamp' => $resume->updated_at,
|
|
'status' => $resume->status,
|
|
];
|
|
})->toArray();
|
|
}
|
|
}
|