From c9b4427d99c86321d77c7defd031b5a970be1d42 Mon Sep 17 00:00:00 2001 From: ashen-1-dev Date: Tue, 15 Dec 2020 16:35:50 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=BE=D1=81=D1=82=D0=B8(CRUD?= =?UTF-8?q?=20+=20PhotoStorage)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/News/NewsController.php | 56 +++++++++++++ .../Controllers/News/NewsFileController.php | 81 +++++++++++++++++++ app/Models/News.php | 14 ++++ app/Models/NewsFile.php | 12 +++ .../2020_12_14_170701_create_news_table.php | 37 +++++++++ ...0_12_15_092036_create_news_files_table.php | 39 +++++++++ routes/api.php | 10 +++ 7 files changed, 249 insertions(+) create mode 100644 app/Http/Controllers/News/NewsController.php create mode 100644 app/Http/Controllers/News/NewsFileController.php create mode 100644 app/Models/News.php create mode 100644 app/Models/NewsFile.php create mode 100644 database/migrations/2020_12_14_170701_create_news_table.php create mode 100644 database/migrations/2020_12_15_092036_create_news_files_table.php diff --git a/app/Http/Controllers/News/NewsController.php b/app/Http/Controllers/News/NewsController.php new file mode 100644 index 0000000..c8e419c --- /dev/null +++ b/app/Http/Controllers/News/NewsController.php @@ -0,0 +1,56 @@ +has('count')) { + $temp = (int)$request->count; + if ($temp>0 && $temp<= 100) { + $count = $temp; + } + } + + return response()->json($news->orderByDesc('created_at')->paginate($count), 200); + + } + + public function store(Request $request) { + // Добавить проверку, после добавление авторизации + $request->validate([ + 'title' => 'required|min:5', + 'description' => 'required', + ]); + $news = News::create($request->all()); + + return response()->json($news, 201); + } + + public function show(News $news) { + + return response()->json($news, 200); + } + + public function edit(News $news, Request $request) { + $request->validate([ + 'title' => 'required|min:5', + 'description' => 'required' + ]); + $news->update($request->all()); + + return response()->json($news, 200); + + } + + public function delete(News $news) { + $news->delete(); + + return response()->json(true, 204); + } +} diff --git a/app/Http/Controllers/News/NewsFileController.php b/app/Http/Controllers/News/NewsFileController.php new file mode 100644 index 0000000..299545e --- /dev/null +++ b/app/Http/Controllers/News/NewsFileController.php @@ -0,0 +1,81 @@ +id; + $max_size = (int)ini_get('upload_max_filesize') * 1000; + $all_ext = implode(',', $this->allExtensions()); + + $this->validate($request, [ + 'name' => 'required', + 'file' => 'required|file|mimes:' . $all_ext . '|max:' . $max_size + ]); + + $file = $request->file('file'); + $ext = $file->getClientOriginalExtension(); + $type = $this->getType($ext); + + if (Storage::putFileAs('public/news/' . $newsId . '/' . $type . '/', $file, $request->name)) { + NewsFile::create([ + 'name' => $request->name, + 'type' => $type, + 'extension' => $ext, + 'news_id' => $newsId, + $file, + $request->name . $ext + ]); + $news->photo_uri = '/storage/news' . '/' . $newsId . '/' . $type . '/' . $request->name; + return true; + } + return false; + } + + + + + + public function delete(NewsFile $file) { + + if (Storage::disk('local')->exists('/public/news/' . $file->news_id . '/' . $file->type . '/' . $file->name )) { + if (Storage::disk('local')->delete('/public/news/' . $file->news_id . '/' . $file->type . '/' . $file->name)) { + return response()->json($file->delete(), 204); + } + } + return response()->json(['News not found'], 404); + } + + + private function getType($ext) + { + if (in_array(strtolower($ext), $this->image_ext)) { + return 'image'; + } + + if (in_array(strtolower($ext), $this->file_ext)) { + return 'file'; + } + } + + private function allExtensions() + { + return array_merge($this->image_ext, $this->file_ext); + } + + + +} diff --git a/app/Models/News.php b/app/Models/News.php new file mode 100644 index 0000000..c37f70b --- /dev/null +++ b/app/Models/News.php @@ -0,0 +1,14 @@ +id(); + $table->string('title'); + $table->text('description'); + $table->string('photo_uri')->nullable(); + $table->unsignedInteger('headteacher_id'); + + $table->foreign('headteacher_id')->references('id')->on('head_teachers'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('news'); + } +} diff --git a/database/migrations/2020_12_15_092036_create_news_files_table.php b/database/migrations/2020_12_15_092036_create_news_files_table.php new file mode 100644 index 0000000..faf08a0 --- /dev/null +++ b/database/migrations/2020_12_15_092036_create_news_files_table.php @@ -0,0 +1,39 @@ +bigIncrements('id'); + $table->string('name'); + $table->string('type'); + $table->string('extension'); + $table->timestamps(); + $table->unsignedInteger('news_id'); + $table->foreign('news_id') + ->references('id')->on('news') + ->onDelete('no action'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('news'); + } +} diff --git a/routes/api.php b/routes/api.php index 94e2235..4f6a33d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -42,3 +42,13 @@ Route::group(['prefix' => 'banktask'], function () { Route::get('/file/{file}/download', 'BankTaskFileController@download'); Route::delete('/file/{file}/delete', 'BankTaskFileController@delete'); Route::put('/file/{file}/update', 'BankTaskFileController@update'); + +Route::group(['prefix' => 'news'], function () { + Route::post('', 'News\NewsController@store'); + Route::get('', 'News\NewsController@index'); + Route::get('/{news}', 'News\NewsController@show'); + Route::put('/{news}', 'News\NewsController@edit'); + Route::delete('/{news}', 'News\NewsController@delete'); + Route::post('/{news}/addphoto', 'News\NewsFileController@store'); + Route::delete('/{file}', 'News\NewsFileController@delete'); +}); \ No newline at end of file