Explorar o código

feat: adiciona tab de midias

ebagabee hai 1 semana
pai
achega
bad55403b1

+ 33 - 0
app/Http/Controllers/KanbanMediaController.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\KanbanMediaService;
+use App\Http\Requests\KanbanMediaRequest;
+use App\Http\Resources\KanbanMediaResource;
+use Illuminate\Http\JsonResponse;
+
+class KanbanMediaController extends Controller
+{
+    public function __construct(
+        protected KanbanMediaService $service,
+    ) {}
+
+    public function index(int $kanbanId): JsonResponse
+    {
+        $medias = $this->service->getByKanban($kanbanId);
+        return $this->successResponse(payload: KanbanMediaResource::collection($medias));
+    }
+
+    public function store(KanbanMediaRequest $request, int $kanbanId): JsonResponse
+    {
+        $media = $this->service->create($kanbanId, auth()->id(), $request->file('file'));
+        return $this->successResponse(payload: new KanbanMediaResource($media), message: __('messages.created'), code: 201);
+    }
+
+    public function destroy(int $kanbanId, int $id): JsonResponse
+    {
+        $this->service->delete($kanbanId, $id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+}

+ 15 - 0
app/Http/Requests/KanbanMediaRequest.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class KanbanMediaRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        return [
+            'file' => 'required|file|max:20480',
+        ];
+    }
+}

+ 24 - 0
app/Http/Resources/KanbanMediaResource.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Support\Facades\Storage;
+
+class KanbanMediaResource extends JsonResource
+{
+    public function toArray(Request $request): array
+    {
+        return [
+            'id'         => $this->id,
+            'kanban_id'  => $this->kanban_id,
+            'file_name'  => $this->file_name,
+            'file_url'   => $this->file_url ? Storage::url($this->file_url) : null,
+            'mime_type'  => $this->mime_type,
+            'user_name'  => $this->user?->name,
+            'created_at' => Carbon::parse($this->created_at)->format('d/m/Y H:i'),
+        ];
+    }
+}

+ 31 - 0
app/Models/KanbanMedia.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+
+class KanbanMedia extends Model
+{
+    use HasFactory, SoftDeletes;
+
+    protected $table = 'kanban_medias';
+
+    protected $guarded = ['id'];
+
+    protected $casts = [
+        'created_at' => 'datetime',
+        'updated_at' => 'datetime',
+    ];
+
+    public function kanban()
+    {
+        return $this->belongsTo(Kanban::class, 'kanban_id');
+    }
+
+    public function user()
+    {
+        return $this->belongsTo(User::class, 'user_id');
+    }
+}

+ 41 - 0
app/Services/KanbanMediaService.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\KanbanMedia;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Http\UploadedFile;
+use Illuminate\Support\Facades\Storage;
+
+class KanbanMediaService
+{
+    public function getByKanban(int $kanbanId): Collection
+    {
+        return KanbanMedia::with('user')
+            ->where('kanban_id', $kanbanId)
+            ->orderBy('created_at', 'desc')
+            ->get();
+    }
+
+    public function create(int $kanbanId, int $userId, UploadedFile $file): KanbanMedia
+    {
+        $fileUrl = $file->store('kanban-media');
+
+        $model = KanbanMedia::create([
+            'kanban_id' => $kanbanId,
+            'user_id'   => $userId,
+            'file_name' => $file->getClientOriginalName(),
+            'file_url'  => $fileUrl,
+            'mime_type' => $file->getMimeType(),
+        ]);
+
+        return $model->load('user');
+    }
+
+    public function delete(int $kanbanId, int $id): bool
+    {
+        $model = KanbanMedia::where('kanban_id', $kanbanId)->findOrFail($id);
+        Storage::delete($model->file_url);
+        return $model->delete();
+    }
+}

+ 29 - 0
database/migrations/2026_06_02_100000_create_kanban_medias_table.php

@@ -0,0 +1,29 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        Schema::create('kanban_medias', function (Blueprint $table) {
+            $table->id();
+            $table->foreignId('kanban_id')->constrained('kanbans')->cascadeOnDelete();
+            $table->foreignId('user_id')->constrained('users');
+            $table->string('file_name');
+            $table->string('file_url');
+            $table->string('mime_type')->nullable();
+            $table->timestamps();
+            $table->softDeletes();
+
+            $table->index('kanban_id');
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('kanban_medias');
+    }
+};

+ 8 - 0
routes/authRoutes/kanban.php

@@ -3,6 +3,7 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\KanbanController;
 use App\Http\Controllers\KanbanReplyController;
+use App\Http\Controllers\KanbanMediaController;
 
 Route::controller(KanbanController::class)->prefix('kanban')->group(function () {
     Route::get('/', 'index')->middleware('permission:kanban,view');
@@ -19,4 +20,11 @@
         Route::put('/{id}', 'update')->middleware('permission:kanban,edit');
         Route::delete('/{id}', 'destroy')->middleware('permission:kanban,delete');
     });
+
+    // Medias
+    Route::prefix('/{kanbanId}/medias')->controller(KanbanMediaController::class)->group(function () {
+        Route::get('/', 'index')->middleware('permission:kanban,view');
+        Route::post('/', 'store')->middleware('permission:kanban,add');
+        Route::delete('/{id}', 'destroy')->middleware('permission:kanban,delete');
+    });
 });