Parcourir la source

Added import catalog job, catalog methods and routes. added upload disk

Alexander Musikhin il y a 11 mois
Parent
commit
bb231283a4

+ 47 - 1
app/Http/Controllers/ProductController.php

@@ -2,9 +2,55 @@
 
 namespace App\Http\Controllers;
 
+use App\Jobs\Import\ImportCatalog;
+use App\Models\Product;
+use Exception;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
 
 class ProductController extends Controller
 {
-    //
+    protected array $data = [
+        'active'    => 'catalog',
+        'title'     => 'Каталог',
+    ];
+
+    public function index()
+    {
+        $this->data['products'] = Product::query()->paginate();
+        return view('catalog.index', $this->data);
+    }
+
+    public function show()
+    {
+
+    }
+
+    public function import(Request $request)
+    {
+        // validate data
+        $request->validate([
+            'year' => 'required|integer|min:2000|max:' . (int)date('Y', strtotime('next year')),
+            'import_file' => 'file',
+        ]);
+
+        // load and save file
+        try {
+            $path = Str::random(2) . '/' . Str::uuid() . '.' .$request->file('import_file')->getClientOriginalExtension();
+            Storage::disk('upload')->put($path, $request->file('import_file')->getContent());
+        } catch (Exception $e) {
+            Log::error('[UPLOAD ERROR]' . $e->getMessage());
+            return view('catalog.index')->with(['danger' => 'Не удалось сохранить файл!']);
+        }
+
+        // todo validate header
+
+
+        // dispatch job
+        ImportCatalog::dispatch($request->year, $path);
+        Log::info('ImportCatalog job created!');
+        return redirect()->route('catalog.index')->with(['success' => 'Задача импорта успешно создана!']);
+    }
 }

+ 35 - 0
app/Jobs/Import/ImportCatalog.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Jobs\Import;
+
+use App\Events\SendWebSocketMessageEvent;
+use Illuminate\Contracts\Queue\ShouldBeUniqueUntilProcessing;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Queue\Queueable;
+use Illuminate\Support\Facades\Log;
+
+class ImportCatalog implements ShouldQueue, ShouldBeUniqueUntilProcessing
+{
+    use Queueable;
+
+    /**
+     * Create a new job instance.
+     */
+    public function __construct(private readonly int $year, private readonly string $path)
+    {
+        //
+    }
+
+    /**
+     * Execute the job.
+     */
+    public function handle(): void
+    {
+        Log::info('ImportCatalog job done!');
+
+
+        // make event
+        event(new SendWebSocketMessageEvent('TEsttttd', 1));
+    }
+
+}

+ 7 - 0
config/filesystems.php

@@ -57,6 +57,13 @@ return [
             'throw' => false,
         ],
 
+        'upload'    => [
+            'driver' => 'local',
+            'root' => storage_path('upload'),
+            'serve' => true,
+            'throw' => false,
+        ],
+
     ],
 
     /*

+ 48 - 0
resources/views/catalog/index.blade.php

@@ -0,0 +1,48 @@
+@extends('layouts.app')
+
+@section('content')
+    <form action="{{ route('catalog.import') }}" method="post" enctype="multipart/form-data">
+        @csrf
+        <input class="form-control mb-3" required type="number" name="year" min="2000" max="{{ (int)date('Y') + 1 }}" placeholder="2020" value="{{ date('Y') }}">
+        <input class="form-control mb-3" required type="file" name="import_file">
+        <button type="submit" class="btn btn-primary">Импорт</button>
+    </form>
+
+    <div class="px-md-3 px-2">
+        <div class="table">
+            <div class="row d-none d-md-flex header px-5 py-4 fw-bold">
+                <div class="col-xl-3">Фото</div>
+                <div class="col-xl-3">Наименование</div>
+                <div class="col-xl-3">фывфывфыв</div>
+                <div class="col-xl-3 text-end">Действия</div>
+            </div>
+
+{{--            @foreach($users as $user)--}}
+{{--                <div class="row px-md-5 px-2 py-4 align-items-center">--}}
+{{--                    <div class="col-xl-3 mb-3">--}}
+{{--                        <span class="ps-2">{{ $user->name }}</span>--}}
+{{--                    </div>--}}
+{{--                    <div class="col-xl-3">--}}
+{{--                        <span class="d-md-none fw-bold">E-mail: </span>{{ $user->email }}--}}
+{{--                    </div>--}}
+{{--                    <div class="col-xl-3">--}}
+{{--                        <span class="d-md-none fw-bold">Роль: </span>{{ roleName($user->role) }}--}}
+{{--                    </div>--}}
+{{--                    <div class="col-xl-3 text-end">--}}
+{{--                        <a href="{{ route('user.show', $user->id) }}"><i class="bi bi-pencil fs-5 text-primary"></i></a>--}}
+{{--                        <a href="#" onclick="if(confirm('Удалить пользователя {{ $user->name }}?')) { document.getElementById('delete-user-{{ $user->id }}').submit(); } ">--}}
+{{--                            <i class="bi bi-trash fs-5 text-danger"></i>--}}
+{{--                        </a>--}}
+{{--                        <form action="{{ route('user.destroy', $user->id) }}" method="post" class="visually-hidden d-none" id="delete-user-{{ $user->id }}">--}}
+{{--                            @csrf--}}
+{{--                            @method('DELETE')--}}
+{{--                        </form>--}}
+{{--                    </div>--}}
+{{--                </div>--}}
+{{--            @endforeach--}}
+        </div>
+    </div>
+    @dump($products)
+    @dump($errors)
+@endsection
+

+ 1 - 1
resources/views/layouts/menu.blade.php

@@ -2,4 +2,4 @@
 @if(hasrole('admin'))
     <li class="nav-item"><a class="nav-link" href="{{ route('user.index') }}">Пользователи</a></li>
 @endif
-<li class="nav-item"><a class="nav-link" href="">меннн</a></li>
+<li class="nav-item"><a class="nav-link" href="{{ route('catalog.index') }}">Каталог</a></li>

+ 6 - 0
routes/web.php

@@ -1,5 +1,6 @@
 <?php
 
+use App\Http\Controllers\ProductController;
 use App\Http\Controllers\UserController;
 use App\Models\Role;
 use Illuminate\Support\Facades\Auth;
@@ -31,5 +32,10 @@ Route::middleware('auth:web')->group(function () {
     Route::get('profile', [UserController::class, 'profile'])->name('user.profile');
     Route::post('profile/store', [UserController::class, 'storeProfile'])->name('profile.store');
 
+    Route::get('catalog', [ProductController::class, 'index'])->name('catalog.index');
+    Route::get('catalog/{product}', [ProductController::class, 'show'])->name('catalog.show');
+    Route::post('catalog/import', [ProductController::class, 'import'])->name('catalog.import');
+
+
 
 });