* @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(); } }