diff --git a/.gitignore b/.gitignore index 226fb64..4577b8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules +/bootstrap /public/hot /public/storage /public/uploads diff --git a/app/Http/Controllers/Admin/MultimediaCategoryCrudController.php b/app/Http/Controllers/Admin/MultimediaCategoryCrudController.php new file mode 100644 index 0000000..7d6faaf --- /dev/null +++ b/app/Http/Controllers/Admin/MultimediaCategoryCrudController.php @@ -0,0 +1,92 @@ +type('select_from_array')->options(['image' => 'Image', 'video' => 'Video']); + + /** + * Columns can be defined using the fluent syntax or array syntax: + * - CRUD::column('price')->type('number'); + * - CRUD::addColumn(['name' => 'price', 'type' => 'number']); + */ + } + + /** + * Define what happens when the Create operation is loaded. + * + * @see https://backpackforlaravel.com/docs/crud-operation-create + * @return void + */ + protected function setupCreateOperation() + { + CRUD::setValidation(MultimediaCategoryRequest::class); + + CRUD::field('title'); + CRUD::field('type')->type('select_from_array')->options(['image' => 'Image', 'video' => 'Video']); + + /** + * Fields can be defined using the fluent syntax or array syntax: + * - CRUD::field('price')->type('number'); + * - CRUD::addField(['name' => 'price', 'type' => 'number'])); + */ + } + + /** + * Define what happens when the Update operation is loaded. + * + * @see https://backpackforlaravel.com/docs/crud-operation-update + * @return void + */ + protected function setupUpdateOperation() + { + $this->setupCreateOperation(); + } + + protected function setupReorderOperation() + { + // define which model attribute will be shown on draggable elements + $this->crud->set('reorder.label', 'title'); + // define how deep the admin is allowed to nest the items + // for infinite levels, set it to 0 + $this->crud->set('reorder.max_level', 1); + } +} diff --git a/app/Http/Controllers/Admin/MultimediaCrudController.php b/app/Http/Controllers/Admin/MultimediaCrudController.php new file mode 100644 index 0000000..86895e3 --- /dev/null +++ b/app/Http/Controllers/Admin/MultimediaCrudController.php @@ -0,0 +1,84 @@ +type('number'); + * - CRUD::addColumn(['name' => 'price', 'type' => 'number']); + */ + } + + /** + * Define what happens when the Create operation is loaded. + * + * @see https://backpackforlaravel.com/docs/crud-operation-create + * @return void + */ + protected function setupCreateOperation() + { + CRUD::setValidation(MultimediaRequest::class); + + CRUD::field('category_id'); + CRUD::field('title'); + CRUD::field('media')->type('upload')->upload(true); + + /** + * Fields can be defined using the fluent syntax or array syntax: + * - CRUD::field('price')->type('number'); + * - CRUD::addField(['name' => 'price', 'type' => 'number'])); + */ + } + + /** + * Define what happens when the Update operation is loaded. + * + * @see https://backpackforlaravel.com/docs/crud-operation-update + * @return void + */ + protected function setupUpdateOperation() + { + $this->setupCreateOperation(); + } +} diff --git a/app/Http/Controllers/Api/ApiController.php b/app/Http/Controllers/Api/ApiController.php index 97575e5..1badf83 100644 --- a/app/Http/Controllers/Api/ApiController.php +++ b/app/Http/Controllers/Api/ApiController.php @@ -33,7 +33,7 @@ class ApiController extends Controller { $this->fractal = new Manager; - $this->locale = $request->header('X-Localization') ?? 'tm'; + $this->locale = $request->header('X-Localization') ?? 'en'; } /** diff --git a/app/Http/Controllers/Api/CategoryController.php b/app/Http/Controllers/Api/CategoryController.php index b674616..65c0666 100644 --- a/app/Http/Controllers/Api/CategoryController.php +++ b/app/Http/Controllers/Api/CategoryController.php @@ -11,6 +11,6 @@ class CategoryController extends ApiController public function index() { $categories = Category::orderBy('lft', 'desc')->get(); - return $this->respondWithCollection($categories, new CategoryTransformer($this->locale)); + return $this->respondWithCollection($categories, new CategoryTransformer($this->locale, 'trading')); } } diff --git a/app/Http/Controllers/Api/MultimediaCategoryController.php b/app/Http/Controllers/Api/MultimediaCategoryController.php new file mode 100644 index 0000000..affcc37 --- /dev/null +++ b/app/Http/Controllers/Api/MultimediaCategoryController.php @@ -0,0 +1,18 @@ +get(); + return $this->respondWithCollection($categories, new CategoryTransformer($this->locale, 'media')); + } + +} diff --git a/app/Http/Controllers/Api/MultimediaController.php b/app/Http/Controllers/Api/MultimediaController.php new file mode 100644 index 0000000..b2e7dae --- /dev/null +++ b/app/Http/Controllers/Api/MultimediaController.php @@ -0,0 +1,16 @@ +with('medias')->get()->first()->medias; + return $this->respondWithCollection($medias, new MediaTransformer()); + } + +} diff --git a/app/Http/Controllers/Api/NewsController.php b/app/Http/Controllers/Api/NewsController.php index 3f2dd72..9aaf613 100644 --- a/app/Http/Controllers/Api/NewsController.php +++ b/app/Http/Controllers/Api/NewsController.php @@ -10,7 +10,7 @@ class NewsController extends ApiController { public function index() { - $news = News::orderBy('date', 'desc')->paginate(9); + $news = News::latest('date')->paginate(9); return $this->respondWithPaginator($news, new NewsTransformer($this->locale)); } } diff --git a/app/Http/Controllers/Api/TradingsController.php b/app/Http/Controllers/Api/TradingsController.php index 27caa82..23ecd4d 100644 --- a/app/Http/Controllers/Api/TradingsController.php +++ b/app/Http/Controllers/Api/TradingsController.php @@ -6,7 +6,6 @@ use App\Models\Category; use App\Models\Group; use App\Models\Trading; use App\Transformers\TradingTransformer; -use Illuminate\Http\Request; class TradingsController extends ApiController { diff --git a/app/Http/Requests/MultimediaCategoryRequest.php b/app/Http/Requests/MultimediaCategoryRequest.php new file mode 100644 index 0000000..654b862 --- /dev/null +++ b/app/Http/Requests/MultimediaCategoryRequest.php @@ -0,0 +1,55 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + // 'name' => 'required|min:5|max:255' + ]; + } + + /** + * Get the validation attributes that apply to the request. + * + * @return array + */ + public function attributes() + { + return [ + // + ]; + } + + /** + * Get the validation messages that apply to the request. + * + * @return array + */ + public function messages() + { + return [ + // + ]; + } +} diff --git a/app/Http/Requests/MultimediaRequest.php b/app/Http/Requests/MultimediaRequest.php new file mode 100644 index 0000000..ff5efad --- /dev/null +++ b/app/Http/Requests/MultimediaRequest.php @@ -0,0 +1,55 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + // 'name' => 'required|min:5|max:255' + ]; + } + + /** + * Get the validation attributes that apply to the request. + * + * @return array + */ + public function attributes() + { + return [ + // + ]; + } + + /** + * Get the validation messages that apply to the request. + * + * @return array + */ + public function messages() + { + return [ + // + ]; + } +} diff --git a/app/Http/Requests/StoreMultimediaCategoryRequest.php b/app/Http/Requests/StoreMultimediaCategoryRequest.php new file mode 100644 index 0000000..0f22b16 --- /dev/null +++ b/app/Http/Requests/StoreMultimediaCategoryRequest.php @@ -0,0 +1,30 @@ +uploadFileToDisk($value, $attribute_name, $disk, $destination_path, $fileName = null); diff --git a/app/Models/Multimedia.php b/app/Models/Multimedia.php new file mode 100644 index 0000000..616ef01 --- /dev/null +++ b/app/Models/Multimedia.php @@ -0,0 +1,31 @@ +belongsTo(MultimediaCategory::class); + } + + public function setMediaAttribute($value) + { + $attribute_name = "media"; + $disk = config('backpack.base.root_disk_name'); + $destination_path = "public/uploads/media"; + + $this->uploadFileToDisk($value, $attribute_name, $disk, $destination_path, $fileName = null); + + // return $this->attributes[$attribute_name]; // uncomment if this is a translatable field + + } +} diff --git a/app/Models/MultimediaCategory.php b/app/Models/MultimediaCategory.php new file mode 100644 index 0000000..dfa04bf --- /dev/null +++ b/app/Models/MultimediaCategory.php @@ -0,0 +1,22 @@ +hasMany(Multimedia::class); + } +} diff --git a/app/Policies/MultimediaCategoryPolicy.php b/app/Policies/MultimediaCategoryPolicy.php new file mode 100644 index 0000000..a22175a --- /dev/null +++ b/app/Policies/MultimediaCategoryPolicy.php @@ -0,0 +1,94 @@ +locale = $locale; + $this->type = $type; } - public function transform(Category $category) + public function transform($category) { - return [ + + return $this->type == 'trading' ? [ 'id' => $category->id, 'title' => $category->getTranslations('title', [$this->locale])[$this->locale], + ] : [ + 'id' => $category->id, + 'title' => $category->getTranslations('title', [$this->locale])[$this->locale], + 'type' => $category->type, ]; } } \ No newline at end of file diff --git a/app/Transformers/MediaTransformer.php b/app/Transformers/MediaTransformer.php new file mode 100644 index 0000000..12fd816 --- /dev/null +++ b/app/Transformers/MediaTransformer.php @@ -0,0 +1,20 @@ +media); + return [ + 'id' => $multimedia->id, + 'title' => $multimedia->title, + 'media' => url($media), + ]; + } +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 89d17c9..f08f56d 100644 --- a/composer.lock +++ b/composer.lock @@ -3547,30 +3547,30 @@ }, { "name": "markbaker/matrix", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576" + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/c66aefcafb4f6c269510e9ac46b82619a904c576", - "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", "phpdocumentor/phpdocumentor": "2.*", "phploc/phploc": "^4.0", "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.4" + "squizlabs/php_codesniffer": "^3.7" }, "type": "library", "autoload": { @@ -3597,9 +3597,9 @@ ], "support": { "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.0" + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" }, - "time": "2021-07-01T19:01:15+00:00" + "time": "2022-12-02T22:17:43+00:00" }, { "name": "meilisearch/meilisearch-php", @@ -3891,16 +3891,16 @@ }, { "name": "nesbot/carbon", - "version": "2.63.0", + "version": "2.64.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347" + "reference": "889546413c97de2d05063b8cb7b193c2531ea211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ad35dd71a6a212b98e4b87e97389b6fa85f0e347", - "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/889546413c97de2d05063b8cb7b193c2531ea211", + "reference": "889546413c97de2d05063b8cb7b193c2531ea211", "shasum": "" }, "require": { @@ -3911,7 +3911,7 @@ "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", @@ -3989,7 +3989,7 @@ "type": "tidelift" } ], - "time": "2022-10-30T18:34:28+00:00" + "time": "2022-11-26T17:36:00+00:00" }, { "name": "nette/schema", diff --git a/database/factories/MultimediaCategoryFactory.php b/database/factories/MultimediaCategoryFactory.php new file mode 100644 index 0000000..010ab7a --- /dev/null +++ b/database/factories/MultimediaCategoryFactory.php @@ -0,0 +1,20 @@ +id(); + $table->text('title'); + $table->string('type'); + $table->integer('parent_id')->default(0)->nullable(); + $table->integer('lft')->default(0); + $table->integer('rgt')->default(0); + $table->integer('depth')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('multimedia_categories'); + } +} diff --git a/database/migrations/2022_12_05_223945_create_multimedia_table.php b/database/migrations/2022_12_05_223945_create_multimedia_table.php new file mode 100644 index 0000000..dfe3074 --- /dev/null +++ b/database/migrations/2022_12_05_223945_create_multimedia_table.php @@ -0,0 +1,35 @@ +id(); + $table->unsignedBigInteger('multimedia_category_id')->unsigned(); + $table->foreign('multimedia_category_id')->references('id')->on('multimedia_categories')->onDelete('cascade'); + $table->text('title')->nullable(); + $table->text('media'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('multimedia'); + } +} diff --git a/database/seeders/MultimediaCategorySeeder.php b/database/seeders/MultimediaCategorySeeder.php new file mode 100644 index 0000000..dbea4b2 --- /dev/null +++ b/database/seeders/MultimediaCategorySeeder.php @@ -0,0 +1,18 @@ + {{ trans('backpack::base.dashboard') }} - - - - + + - \ No newline at end of file + diff --git a/routes/api.php b/routes/api.php index 0ca51a3..c54068f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -9,8 +9,9 @@ use App\Http\Controllers\Api\TradingsController; use App\Http\Controllers\Api\NewsController; use App\Http\Controllers\Api\CategoryController; use App\Http\Controllers\Api\DocumentController; -use App\Http\Controllers\Api\SelectedTradingController; use App\Http\Controllers\Api\TarifController; +use App\Http\Controllers\Api\MultimediaCategoryController; +use App\Http\Controllers\Api\MultimediaController; /* |-------------------------------------------------------------------------- @@ -36,3 +37,6 @@ Route::get('categories/{id}/tradings', [TradingsController::class, 'selectedTrad Route::get('news', [NewsController::class, 'index']); Route::get('documents', [DocumentController::class, 'index']); Route::get('tariffs', [TarifController::class, 'index']); + +Route::get('media/categories', [MultimediaCategoryController::class, 'index']); +Route::get('medias/{category}', [MultimediaController::class, 'index']); diff --git a/routes/backpack/custom.php b/routes/backpack/custom.php index 87b6106..cb54e58 100644 --- a/routes/backpack/custom.php +++ b/routes/backpack/custom.php @@ -23,4 +23,6 @@ Route::group([ Route::crud('selected-trading', 'SelectedTradingCrudController'); Route::crud('tarif', 'TarifCrudController'); + Route::crud('multimedia-category', 'MultimediaCategoryCrudController'); + Route::crud('multimedia', 'MultimediaCrudController'); }); // this should be the absolute last line of this file \ No newline at end of file