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)); } }