145 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers\Repuve;
use App\Http\Controllers\Controller;
use App\Http\Requests\Repuve\ApkStorageRequest;
use App\Http\Requests\Repuve\ApkUpdateRequest;
use App\Models\ApkLog;
use App\Models\ApkVersion;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Support\Facades\Storage;
use Notsoweb\ApiResponse\Enums\ApiResponse;
class AppController extends Controller implements HasMiddleware
{
/**
* Middleware
*/
public static function middleware(): array
{
return [
self::can('apk.index', ['index']),
self::can('apk.create', ['store']),
self::can('apk.edit', ['update']),
self::can('apk.destroy', ['destroy']),
self::can('apk.download', ['download']),
];
}
/**
* Listar versiones: actual, 2 anteriores y las no disponibles
*/
public function index()
{
$latestId = ApkVersion::latest()->value('id');
$versions = ApkVersion::with('uploader:id,name')
->withCount('logs')
->latest()
->get()
->map(function ($version) use ($latestId) {
$version->is_current = $version->id === $latestId;
$version->available = $version->id === $latestId;
return $version;
});
return ApiResponse::OK->response([
'current' => $versions->where('is_current', true)->first(),
'recent' => $versions->where('is_current', false)->take(2)->values(),
'unavailable' => $versions->where('is_current', false)->skip(2)->values(),
]);
}
/**
* Subir nueva versión del APK
*/
public function store(ApkStorageRequest $request)
{
$file = $request->file('apk');
$fileName = 'repuve-app-' . now()->format('Y-m-d') . '.apk';
// Eliminar APK anterior del storage
foreach (Storage::disk('public')->files('apk') as $existing) {
Storage::disk('public')->delete($existing);
}
$path = $file->storeAs('apk', $fileName, 'public');
ApkVersion::create([
'file_name' => $fileName,
'path' => $path,
'changelog' => $request->input('changelog'),
'uploaded_by' => auth()->id(),
]);
return ApiResponse::OK->response([
'message' => 'APK subido correctamente',
'file' => $fileName,
]);
}
/**
* Actualizar nombre y/o changelog de una versión
*/
public function update(ApkUpdateRequest $request, ApkVersion $app)
{
$data = $request->only(['changelog', 'file_name']);
if ($request->filled('file_name') && $request->input('file_name') !== $app->file_name) {
$newFileName = $request->input('file_name');
$newPath = 'apk/' . $newFileName;
if (Storage::disk('public')->exists($newPath)) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'Ya existe un archivo con ese nombre.',
]);
}
Storage::disk('public')->move($app->path, $newPath);
$data['file_name'] = $newFileName;
$data['path'] = $newPath;
}
$app->update($data);
return ApiResponse::OK->response([
'message' => 'Versión actualizada correctamente',
]);
}
/**
* Eliminar una versión
*/
public function destroy(ApkVersion $app)
{
Storage::disk('public')->delete($app->path);
$app->delete();
return ApiResponse::OK->response([
'message' => 'Versión eliminada correctamente',
]);
}
/**
* Descargar APK más reciente y registrar log
*/
public function download()
{
$version = ApkVersion::latest()->first();
if (!$version) {
abort(404, 'No hay APK disponible para descargar.');
}
ApkLog::create([
'apk_version_id' => $version->id,
'downloaded_by' => auth()->id(),
]);
return redirect(asset('storage/' . $version->path));
}
}