@extends('layouts.template.main') @push('styles') @endpush @section('title', 'Quản lý APK') @section('content') @php $userRole = auth()->user()->role ?? ''; $isTester = $userRole === 'Tester'; $isDev = $userRole === 'Developer'; $isAdmin = $userRole === 'Admin'; $isMarketing = $userRole === 'Marketing'; // Xác định tab hiển thị ban đầu: // - Tester: mặc định vào màn 'test' (Danh sách ứng dụng cần test) // - Developer: mặc định vào màn 'dev' (Upload và quản lý APK) // - Admin: có thể chuyển đổi cả 2 màn, mặc định theo param tab/view hoặc 'dev' $reqTab = request('tab') ?: request('view'); if ($isTester) { $initialMode = 'test'; } elseif ($isDev) { $initialMode = 'dev'; } elseif ($isMarketing){ $initialMode = 'Marketing'; } else { $initialMode = in_array($reqTab, ['test', 'dev', 'Marketing']) ? $reqTab : 'dev'; } @endphp
{{-- dev --}} @if (in_array($userRole, ['Admin', 'Developer'])) @include('apk-manager.dev') @endif {{-- tester --}} @if (in_array($userRole, ['Admin', 'Tester'])) @include('apk-manager.tester') @endif {{-- tester --}} @if (in_array($userRole, ['Admin', 'Marketing'])) @include('apk-manager.marketing') @endif {{-- download --}} @include('apk-manager.download-apk')
{{-- qr --}} @include('apk-manager.qa-index')
@php $statusMapPHP = [ 'waiting' => 'Chờ test', 'testing' => 'Đang test', 'failed' => 'Cần sửa', 'passed' => 'Pass', 'published' => 'Đã Public', ]; $releasesJsonData = $releases ->map(function ($r) use ($statusMapPHP) { $app = $r->appAndroid ?? $r->appIos; $latestBuild = $r->latestBuild ?? $r->builds->first(); $statusKey = $r->isPublished() ? 'published' : $r->test_status ?? 'waiting'; $uploaderName = $r->uploader?->name ?? 'Developer'; $appName = $app?->app_name ?? ($r->original_name ?? 'Ứng dụng'); $pkg = $app?->package ?? ''; $activeShare = $r->shares->first(fn($s) => $s->isActive()); if (!$activeShare) { try { $activeShare = $r->shares()->create([ 'token' => \Illuminate\Support\Str::random(48), 'expires_at' => null, // vĩnh viễn 'created_by' => auth()->id() ?? $r->uploaded_by, ]); } catch (\Throwable $e) { } } $qrBase64 = null; if ($activeShare) { try { $writer = new \BaconQrCode\Writer( new \BaconQrCode\Renderer\ImageRenderer( new \BaconQrCode\Renderer\RendererStyle\RendererStyle(280, 2), new \BaconQrCode\Renderer\Image\SvgImageBackEnd(), ), ); $qrBase64 = 'data:image/svg+xml;base64,' . base64_encode($writer->writeString(route('apks.public.show', $activeShare->token))); } catch (\Throwable $e) { } } return [ 'id' => $r->id, 'app_android_id' => $r->app_android_id, 'app_ios_id' => $r->app_ios_id, 'app_key' => $r->app_android_id ? 'android_' . $r->app_android_id : 'ios_' . $r->app_ios_id, 'app_name' => $appName, 'package' => $pkg, 'version_name' => $r->version_name, 'version_code' => $r->version_code, 'build_rev' => $latestBuild?->revision ?? ($r->current_revision ?? 1), 'build_notes' => $latestBuild?->notes ?? ($r->release_notes ?? ''), 'build_count' => $r->builds->count(), 'download_count' => $r->download_count ?? 0, 'test_status' => $statusKey, 'status_label' => $statusMapPHP[$statusKey] ?? $statusKey, 'is_published' => $r->isPublished(), 'published_at' => $r->published_at ? $r->published_at->toIso8601String() : null, 'publisher' => $r->publisher ? ['id' => $r->publisher->id, 'name' => $r->publisher->name] : null, 'uploader' => ['id' => $r->uploader?->id, 'name' => $uploaderName], 'uploader_name' => $uploaderName, 'updated_at' => $r->updated_at ? $r->updated_at->format('d/m H:i') : '', 'share' => $activeShare ? [ 'id' => $activeShare->id, 'token' => $activeShare->token, 'url' => route('apks.public.show', $activeShare->token), 'qr_svg' => $qrBase64 ?: ('https://api.qrserver.com/v1/create-qr-code/?size=280x280&data=' . urlencode(route('apks.public.show', $activeShare->token))), ] : null, 'builds' => $r->builds ->map( fn($b) => [ 'id' => $b->id, 'revision' => $b->revision, 'notes' => $b->notes, 'created_at' => $b->created_at ? $b->created_at->format('d/m H:i') : '', ], ) ->values(), 'reports' => $r->reports ->map( fn($rep) => [ 'id' => $rep->id, 'result' => $rep->result, 'feedback' => $rep->feedback, 'created_at' => $rep->created_at ? $rep->created_at->format('d/m H:i') : '', 'tester' => ['name' => $rep->tester?->name ?? 'Tester'], ], ) ->values(), 'app_android' => $r->appAndroid ? [ 'id' => $r->appAndroid->id, 'app_name' => $r->appAndroid->app_name, 'package' => $r->appAndroid->package, ] : null, 'app_ios' => $r->appIos ? ['id' => $r->appIos->id, 'app_name' => $r->appIos->app_name, 'package' => $r->appIos->package] : null, 'latest_build' => $latestBuild ? ['id' => $latestBuild->id, 'revision' => $latestBuild->revision] : null, ]; }) ->values(); @endphp @push('scripts') @endpush @endsection