@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