Includes BMAD bmb/bmm/cis/tea workflow modules, folder (declaration) feature implementation (controllers, models, enums, views, tests), claude/cursor command configs, and email templates. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
82 lines
2.3 KiB
PHP
82 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Enums\ActorType;
|
|
use App\Models\Folder;
|
|
use App\Models\MediaDownload;
|
|
use App\Models\Workspace;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Spatie\MediaLibrary\MediaCollections\Models\Media;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class FolderMediaController extends Controller
|
|
{
|
|
protected function currentWorkspace(Request $request): Workspace
|
|
{
|
|
$workspaceId = $request->session()->get('current_workspace_id');
|
|
|
|
return Workspace::query()->findOrFail($workspaceId);
|
|
}
|
|
|
|
/**
|
|
* Store a newly uploaded file.
|
|
*/
|
|
public function store(Request $request, Folder $folder): RedirectResponse
|
|
{
|
|
$workspace = $this->currentWorkspace($request);
|
|
|
|
if ($folder->workspace_id !== $workspace->id) {
|
|
abort(404);
|
|
}
|
|
|
|
$request->validate([
|
|
'files' => ['required', 'array', 'min:1'],
|
|
'files.*' => ['file', 'max:10240'],
|
|
]);
|
|
|
|
$user = $request->user();
|
|
|
|
foreach ($request->file('files') as $file) {
|
|
$folder->addMedia($file)
|
|
->withCustomProperties([
|
|
'uploaded_by_type' => ActorType::User,
|
|
'uploaded_by_id' => $user->id,
|
|
])
|
|
->toMediaCollection('documents');
|
|
}
|
|
|
|
return back()->with('flash', ['type' => 'success', 'message' => 'Fichier(s) téléchargé(s).']);
|
|
}
|
|
|
|
/**
|
|
* Download a media file.
|
|
*/
|
|
public function download(Request $request, Folder $folder, int $mediaId): Response
|
|
{
|
|
$workspace = $this->currentWorkspace($request);
|
|
|
|
if ($folder->workspace_id !== $workspace->id) {
|
|
abort(404);
|
|
}
|
|
|
|
$media = Media::query()
|
|
->where('model_type', Folder::class)
|
|
->where('model_id', $folder->id)
|
|
->where('id', $mediaId)
|
|
->firstOrFail();
|
|
|
|
try {
|
|
MediaDownload::query()->updateOrCreate(
|
|
['media_id' => $media->id, 'user_id' => $request->user()->id],
|
|
['downloaded_at' => now()],
|
|
);
|
|
} catch (\Throwable) {
|
|
// Tracking failure must never block the download
|
|
}
|
|
|
|
return $media->toResponse($request);
|
|
}
|
|
}
|