84 lines
2.7 KiB
PHP
84 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\Tenant;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Event;
|
|
use App\Models\Photo;
|
|
use App\Models\Tenant;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Carbon;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
public function __invoke(Request $request): JsonResponse
|
|
{
|
|
$tenant = $request->attributes->get('tenant');
|
|
|
|
if (! $tenant instanceof Tenant) {
|
|
$decoded = $request->attributes->get('decoded_token', []);
|
|
$tenantId = Arr::get($decoded, 'tenant_id');
|
|
|
|
if ($tenantId) {
|
|
$tenant = Tenant::query()->find($tenantId);
|
|
}
|
|
}
|
|
|
|
if (! $tenant instanceof Tenant) {
|
|
return response()->json([
|
|
'message' => 'Tenant context missing.',
|
|
], 401);
|
|
}
|
|
|
|
$eventsQuery = Event::query()
|
|
->where('tenant_id', $tenant->getKey());
|
|
|
|
$activeEvents = (clone $eventsQuery)
|
|
->where(fn ($query) => $query
|
|
->where('is_active', true)
|
|
->orWhere('status', 'published'))
|
|
->count();
|
|
|
|
$upcomingEvents = (clone $eventsQuery)
|
|
->whereDate('date', '>=', Carbon::now()->startOfDay())
|
|
->count();
|
|
|
|
$eventsWithTasks = (clone $eventsQuery)
|
|
->whereHas('tasks')
|
|
->count();
|
|
|
|
$totalEvents = (clone $eventsQuery)->count();
|
|
|
|
$taskProgress = $totalEvents > 0
|
|
? (int) round(($eventsWithTasks / $totalEvents) * 100)
|
|
: 0;
|
|
|
|
$newPhotos = Photo::query()
|
|
->whereHas('event', fn ($query) => $query->where('tenant_id', $tenant->getKey()))
|
|
->where('created_at', '>=', Carbon::now()->subDays(7))
|
|
->count();
|
|
|
|
$activePackage = $tenant->tenantPackages()
|
|
->with('package')
|
|
->where('active', true)
|
|
->orderByDesc('expires_at')
|
|
->orderByDesc('purchased_at')
|
|
->first();
|
|
|
|
return response()->json([
|
|
'active_events' => $activeEvents,
|
|
'new_photos' => $newPhotos,
|
|
'task_progress' => $taskProgress,
|
|
'credit_balance' => $tenant->event_credits_balance ?? null,
|
|
'upcoming_events' => $upcomingEvents,
|
|
'active_package' => $activePackage ? [
|
|
'name' => $activePackage->package?->getNameForLocale(app()->getLocale()) ?? $activePackage->package?->name ?? '',
|
|
'expires_at' => optional($activePackage->expires_at)->toIso8601String(),
|
|
'remaining_events' => $activePackage->remaining_events ?? null,
|
|
] : null,
|
|
]);
|
|
}
|
|
}
|