145 lines
4.1 KiB
PHP
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));
|
|
}
|
|
}
|