feat:APK 파일 다운로드 링크 추가

- APK 파일명 클릭 시 다운로드, download_count 자동 증가
- app_releases 디스크 스트리밍 다운로드 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-30 23:37:41 +09:00
parent 95ef55470e
commit 097504e5c9
3 changed files with 33 additions and 3 deletions

View File

@@ -2,10 +2,13 @@
namespace App\Http\Controllers;
use App\Models\AppVersion;
use App\Services\AppVersionService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\StreamedResponse;
class AppVersionController extends Controller
{
@@ -71,6 +74,26 @@ public function update(Request $request, int $id): RedirectResponse
->with('success', '버전이 수정되었습니다.');
}
/**
* APK 다운로드
*/
public function download(int $id): StreamedResponse
{
$version = AppVersion::findOrFail($id);
if (! $version->apk_path || ! Storage::disk('app_releases')->exists($version->apk_path)) {
abort(404, 'APK 파일을 찾을 수 없습니다.');
}
$version->increment('download_count');
$fileName = $version->apk_original_name ?: "sam-v{$version->version_name}.apk";
return Storage::disk('app_releases')->download($version->apk_path, $fileName, [
'Content-Type' => 'application/vnd.android.package-archive',
]);
}
/**
* 활성 토글
*/

View File

@@ -137,9 +137,15 @@ class="rounded border-gray-300 text-blue-600 shadow-sm focus:ring-blue-500">
</td>
<td class="px-4 py-3 whitespace-nowrap text-sm {{ $isTrashed ? 'text-red-300' : 'text-gray-500' }}">
@if($version->apk_path)
<span class="{{ $isTrashed ? 'text-red-300' : 'text-green-600' }}" title="{{ $version->apk_original_name }}">
{{ $version->apk_original_name ? \Illuminate\Support\Str::limit($version->apk_original_name, 20) : 'APK' }}
</span>
@if($isTrashed)
<span class="text-red-300" title="{{ $version->apk_original_name }}">
{{ $version->apk_original_name ? \Illuminate\Support\Str::limit($version->apk_original_name, 20) : 'APK' }}
</span>
@else
<a href="{{ route('app-versions.download', $version->id) }}" class="text-green-600 hover:text-green-800 hover:underline" title="{{ $version->apk_original_name }}">
{{ $version->apk_original_name ? \Illuminate\Support\Str::limit($version->apk_original_name, 20) : 'APK' }}
</a>
@endif
@if($version->apk_size)
<span class="text-xs {{ $isTrashed ? 'text-red-200' : 'text-gray-400' }}">({{ number_format($version->apk_size / 1024 / 1024, 1) }}MB)</span>
@endif

View File

@@ -357,6 +357,7 @@
Route::get('/', [AppVersionController::class, 'index'])->name('index');
Route::post('/', [AppVersionController::class, 'store'])->name('store');
Route::put('/{id}', [AppVersionController::class, 'update'])->name('update');
Route::get('/{id}/download', [AppVersionController::class, 'download'])->name('download');
Route::post('/{id}/toggle', [AppVersionController::class, 'toggleActive'])->name('toggle');
Route::delete('/{id}', [AppVersionController::class, 'destroy'])->name('destroy');
Route::post('/{id}/restore', [AppVersionController::class, 'restore'])->name('restore');