init commit
This commit is contained in:
154
app/Http/Controllers/DashboardController.php
Normal file
154
app/Http/Controllers/DashboardController.php
Normal file
@@ -0,0 +1,154 @@
|
||||
<?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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user