From 712ceac19c2ffdad8ddc5932d569acf67e538e1e Mon Sep 17 00:00:00 2001 From: sergeybodin Date: Thu, 8 Jun 2023 12:00:00 +0300 Subject: [PATCH 1/3] video --- .../seeders/Objects/FieldsTableSeeder.php | 6 +++++ .../Objects/ObjectTypeFieldsTableSeeder.php | 4 ++-- .../Objects/ObjectTypesTableSeeder.php | 2 +- database/seeders/Pages/PagesTableSeeder.php | 23 ++++--------------- 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/database/seeders/Objects/FieldsTableSeeder.php b/database/seeders/Objects/FieldsTableSeeder.php index de5308c..648b038 100644 --- a/database/seeders/Objects/FieldsTableSeeder.php +++ b/database/seeders/Objects/FieldsTableSeeder.php @@ -78,6 +78,12 @@ class FieldsTableSeeder extends Seeder { 'type' => FieldType::IMAGE, 'multiple' => true, 'required' => true + ], + + 'video-url' => [ + 'title' => 'Ссылка на видео', + 'type' => FieldType::STRING, + 'required' => true ] ]; diff --git a/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php b/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php index 70afb8d..27832d7 100644 --- a/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php +++ b/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php @@ -45,9 +45,9 @@ class ObjectTypeFieldsTableSeeder extends Seeder { 'fields' => ['documents-required'] ] ], - 'page-section-videos' => [ + 'page-section-video' => [ 'common' => [ - 'fields' => [] + 'fields' => ['video-url'] ] ] diff --git a/database/seeders/Objects/ObjectTypesTableSeeder.php b/database/seeders/Objects/ObjectTypesTableSeeder.php index 4b6e7de..3e6110b 100644 --- a/database/seeders/Objects/ObjectTypesTableSeeder.php +++ b/database/seeders/Objects/ObjectTypesTableSeeder.php @@ -31,7 +31,7 @@ class ObjectTypesTableSeeder extends Seeder { 'page-section-documents' => [ 'title' => 'Документы' ], - 'page-section-videos' => [ + 'page-section-video' => [ 'title' => 'Видео' ] ] diff --git a/database/seeders/Pages/PagesTableSeeder.php b/database/seeders/Pages/PagesTableSeeder.php index 0c987ae..c260546 100644 --- a/database/seeders/Pages/PagesTableSeeder.php +++ b/database/seeders/Pages/PagesTableSeeder.php @@ -11,11 +11,7 @@ class PagesTableSeeder extends Seeder public array $pages = [ 'О центре' => [ 'children' => [ - 'Руководство' => [ - 'children' => [ - - ] - ], + 'Руководство' => [], 'Документы' => [ 'children' => [ 'Документы об учреждении' => [], @@ -27,9 +23,7 @@ class PagesTableSeeder extends Seeder 'Специальная оценка условий труда' => [] ] ], - 'Структура' => [ - - ], + 'Структура' => [], 'Наблюдательный совет' => [ 'children' => [ 'Структура' => [], @@ -37,9 +31,7 @@ class PagesTableSeeder extends Seeder 'Решения' => [] ] ], - 'Закупки' => [ - - ], + 'Закупки' => [], 'Противодействие коррупции' => [ 'children' => [ 'ФЗ, указы, постановления' => [], @@ -92,11 +84,7 @@ class PagesTableSeeder extends Seeder 'Ответы на часто задаваемые вопросы' => [], ] ], - 'КСИ' => [ - 'children' => [ - '' => [], - ] - ], + 'КСИ' => [], 'Добровольная сертификация' => [ 'children' => [ 'О системе' => [], @@ -135,8 +123,7 @@ class PagesTableSeeder extends Seeder 'Контакты для СМИ' => [], ] ], - 'Контакты' => [ - ] + 'Контакты' => [] ]; public function run() From cba577cb2be3e7a73ee199eaa90096229822db27 Mon Sep 17 00:00:00 2001 From: sergeybodin Date: Fri, 16 Jun 2023 15:45:36 +0300 Subject: [PATCH 2/3] major --- .../Objects/FieldsGroupTransformer.php | 1 - .../Publications/PublicationTransformer.php | 6 +-- .../seeders/Objects/FieldsTableSeeder.php | 40 +++++++------------ .../Objects/ObjectTypeFieldsTableSeeder.php | 15 +++---- .../Objects/ObjectTypesTableSeeder.php | 11 ++--- 5 files changed, 27 insertions(+), 46 deletions(-) diff --git a/app/Transformers/Objects/FieldsGroupTransformer.php b/app/Transformers/Objects/FieldsGroupTransformer.php index 00cf3d1..19253e2 100644 --- a/app/Transformers/Objects/FieldsGroupTransformer.php +++ b/app/Transformers/Objects/FieldsGroupTransformer.php @@ -8,7 +8,6 @@ use League\Fractal\TransformerAbstract; class FieldsGroupTransformer extends TransformerAbstract { protected array $defaultIncludes = [ - ]; protected array $availableIncludes = [ diff --git a/app/Transformers/Publications/PublicationTransformer.php b/app/Transformers/Publications/PublicationTransformer.php index a051564..16c0819 100644 --- a/app/Transformers/Publications/PublicationTransformer.php +++ b/app/Transformers/Publications/PublicationTransformer.php @@ -16,14 +16,14 @@ use League\Fractal\TransformerAbstract; class PublicationTransformer extends TransformerAbstract { protected array $defaultIncludes = [ - + 'poster' ]; protected array $availableIncludes = [ 'page', 'poster', 'author', 'sections', 'sidebars', 'permissions' ]; - public function transform(Page $model): array { + public function transform(Publication $model): array { return [ 'id' => $model->uuid, 'slug' => $model->slug, @@ -42,7 +42,7 @@ class PublicationTransformer extends TransformerAbstract { } public function includePoster(Publication $model): ?Item { - return $model->poster ? $this->item($model->poster, new AssetTransformer()) : null; + return $model->poster ? $this->item($model->poster, new AssetTransformer()) : null; } public function includeAuthor(Publication $model): ?Item { diff --git a/database/seeders/Objects/FieldsTableSeeder.php b/database/seeders/Objects/FieldsTableSeeder.php index 648b038..5d9ea3b 100644 --- a/database/seeders/Objects/FieldsTableSeeder.php +++ b/database/seeders/Objects/FieldsTableSeeder.php @@ -32,16 +32,6 @@ class FieldsTableSeeder extends Seeder { 'required' => true ], - 'text' => [ - 'title' => 'Содержимое текстового блока', - 'type' => FieldType::TEXT - ], - 'text-required' => [ - 'title' => 'Содержимое текстового блока', - 'type' => FieldType::TEXT, - 'required' => true - ], - 'html' => [ 'title' => 'Содержимое текстового блока', 'type' => FieldType::HTML @@ -52,21 +42,21 @@ class FieldsTableSeeder extends Seeder { 'required' => true ], - 'list-type' => [ - 'title' => 'Вид списка', - 'type' => FieldType::RELATION, - 'required' => true, - 'params' => [ - 'related' => DictionaryItem::class, 'transformer' => DictionaryItemTransformer::class, - 'options' => ['show' => true, 'whereHas' => ['dictionary' => ['name' => 'list-types']]] - ] - ], - 'list-items' => [ - 'title' => 'Элементы списка', - 'type' => FieldType::TEXT, - 'multiple' => true, - 'required' => true - ], +// 'list-type' => [ +// 'title' => 'Вид списка', +// 'type' => FieldType::RELATION, +// 'required' => true, +// 'params' => [ +// 'related' => DictionaryItem::class, 'transformer' => DictionaryItemTransformer::class, +// 'options' => ['show' => true, 'whereHas' => ['dictionary' => ['name' => 'list-types']]] +// ] +// ], +// 'list-items' => [ +// 'title' => 'Элементы списка', +// 'type' => FieldType::TEXT, +// 'multiple' => true, +// 'required' => true +// ], 'images' => [ 'title' => 'Изображения', diff --git a/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php b/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php index 27832d7..39df52d 100644 --- a/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php +++ b/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php @@ -20,21 +20,16 @@ class ObjectTypeFieldsTableSeeder extends Seeder { 'fields' => ['header-required'] ] ], - 'page-section-text' => [ - 'common' => [ - 'fields' => ['text-required'] - ] - ], 'page-section-html' => [ 'common' => [ 'fields' => ['html-required'] ] ], - 'page-section-list' => [ - 'common' => [ - 'fields' => ['list-type', 'list-items'] - ] - ], +// 'page-section-list' => [ +// 'common' => [ +// 'fields' => ['list-type', 'list-items'] +// ] +// ], 'page-section-images' => [ 'common' => [ 'fields' => ['images-required'] diff --git a/database/seeders/Objects/ObjectTypesTableSeeder.php b/database/seeders/Objects/ObjectTypesTableSeeder.php index 3e6110b..96086de 100644 --- a/database/seeders/Objects/ObjectTypesTableSeeder.php +++ b/database/seeders/Objects/ObjectTypesTableSeeder.php @@ -16,15 +16,12 @@ class ObjectTypesTableSeeder extends Seeder { 'page-section-header' => [ 'title' => 'Заголовок' ], - 'page-section-text' => [ + 'page-section-html' => [ 'title' => 'Текстовый блок' ], - 'page-section-html' => [ - 'title' => 'Текстовый блок с разметкой' - ], - 'page-section-list' => [ - 'title' => 'Список' - ], +// 'page-section-list' => [ +// 'title' => 'Список' +// ], 'page-section-images' => [ 'title' => 'Изображения' ], From 842b26e6596927c5d6ae6397baffae696b7885b9 Mon Sep 17 00:00:00 2001 From: sergeybodin Date: Wed, 21 Jun 2023 07:26:20 +0300 Subject: [PATCH 3/3] news --- .../Publications/PublicationsController.php | 26 +++++- app/Models/Pages/Page.php | 19 +++- app/Models/Publications/Publication.php | 1 + app/Services/Forms/FormsService.php | 2 + .../Forms/Pages/PageFormsServices.php | 2 +- .../Forms/Publications/PublicationForms.php | 88 +++++++++++++++++++ .../Publications/PublicationFormsServices.php | 9 ++ .../Publications/PublicationTransformer.php | 1 + ..._add_description_to_publications_table.php | 32 +++++++ routes/api.php | 3 + 10 files changed, 175 insertions(+), 8 deletions(-) create mode 100644 app/Services/Forms/Publications/PublicationForms.php create mode 100644 app/Services/Forms/Publications/PublicationFormsServices.php create mode 100644 database/migrations/2023_06_21_071812_add_description_to_publications_table.php diff --git a/app/Http/Controllers/Api/Publications/PublicationsController.php b/app/Http/Controllers/Api/Publications/PublicationsController.php index e0db9dc..2118bc4 100644 --- a/app/Http/Controllers/Api/Publications/PublicationsController.php +++ b/app/Http/Controllers/Api/Publications/PublicationsController.php @@ -8,6 +8,7 @@ use App\Models\Publications\Publication; use App\Transformers\Publications\PublicationTransformer; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class PublicationsController extends Controller { protected Publication $model; @@ -22,14 +23,23 @@ class PublicationsController extends Controller { } public function index(Request $request): JsonResponse { - $query = $this->model->query(); - if ($page = Page::byUuid($request->get('page'))->first()) $query->where(['page_id' => $page->id]); + $where = ['is_published' => true]; + if (Auth::check()) { + if ($request->has('edit_mode')) { + if ($request->get('edit_mode')==='yes') { + unset($where['is_published']); + } + } + } + $query = $this->model->query()->orderBy('id', 'desc'); + if ($page = Page::byUuid($request->get('page'))->first()) $where[] = ['page_id' => $page->id]; + $query->where($where); $paginator = $query->paginate(config('app.pagination_limit')); return fractal($paginator, new PublicationTransformer())->respond(); } public function show(Request $request, $id): JsonResponse { - $model = $this->model->byUuid($id)->firstOrFail(); + $model = $this->model->bySlug($id)->firstOrFail(); return fractal($model, new PublicationTransformer())->respond(); } @@ -41,10 +51,18 @@ class PublicationsController extends Controller { public function update(Request $request, $uuid): void { } - public function destroy(Request $request, $uuid): JsonResponse { + public function destroy(Request $request, $uuid) { $model = $this->model->byUuid($uuid)->firstOrFail(); $model->delete(); return response()->json(null, 204); } + public function published(Request $request, $uuid): JsonResponse { + $model = $this->model->byUuid($uuid)->firstOrFail(); + $data = [ + 'is_published' => $request->get('publish') + ]; + $model->update($data); + return fractal($model, new PublicationTransformer())->respond(); + } } diff --git a/app/Models/Pages/Page.php b/app/Models/Pages/Page.php index 1809557..29fc752 100644 --- a/app/Models/Pages/Page.php +++ b/app/Models/Pages/Page.php @@ -96,9 +96,22 @@ class Page extends Model { public static function byUrl($url) { if ($url = trim($url, '/ ')) { $query = self::query(); - collect(explode('/', $url))->reverse()->values()->each(function($slug, $index) use ($query) { - if ($slug !== '') { - $index ? $query->nthParentSlug($index, $slug) : $query->bySlug($slug); + $reduceIndex = 0; + collect(explode('/', $url))->reverse()->values()->each(function($slug, $index) use ($query, &$reduceIndex) { + $exist = self::query()->where(['slug' => $slug])->exists(); + if ($exist) { + if ($slug !== '') { + $currentIndex = $index - $reduceIndex; + $currentIndex ? $query->nthParentSlug($currentIndex, $slug) : $query->bySlug($slug); + } + } else { + $reduceIndex++; + $exist = Publication::query()->where(['slug' => $slug])->exists(); + if ($exist) { + $query->whereHas('publications', function($query) use($slug) { + $query->where(['slug' => $slug]); + }); + } } }); return $query->first(); diff --git a/app/Models/Publications/Publication.php b/app/Models/Publications/Publication.php index a03476d..bd90cfb 100644 --- a/app/Models/Publications/Publication.php +++ b/app/Models/Publications/Publication.php @@ -28,6 +28,7 @@ class Publication extends Model { 'type', 'name', 'excerpt', + 'description', 'is_published' ]; diff --git a/app/Services/Forms/FormsService.php b/app/Services/Forms/FormsService.php index e03717b..ebff592 100644 --- a/app/Services/Forms/FormsService.php +++ b/app/Services/Forms/FormsService.php @@ -3,6 +3,7 @@ namespace App\Services\Forms; use App\Services\Forms\Pages\PageFormsServices; +use App\Services\Forms\Publications\PublicationFormsServices; use App\Services\Forms\Users\UserFormsServices; class FormsService { @@ -10,6 +11,7 @@ class FormsService { public static array $services = [ PageFormsServices::class, + PublicationFormsServices::class, UserFormsServices::class ]; diff --git a/app/Services/Forms/Pages/PageFormsServices.php b/app/Services/Forms/Pages/PageFormsServices.php index ca10d49..f660866 100644 --- a/app/Services/Forms/Pages/PageFormsServices.php +++ b/app/Services/Forms/Pages/PageFormsServices.php @@ -4,6 +4,6 @@ namespace App\Services\Forms\Pages; class PageFormsServices { public static array $services = [ - + 'published' => PublicationForms::class ]; } diff --git a/app/Services/Forms/Publications/PublicationForms.php b/app/Services/Forms/Publications/PublicationForms.php new file mode 100644 index 0000000..453bbb6 --- /dev/null +++ b/app/Services/Forms/Publications/PublicationForms.php @@ -0,0 +1,88 @@ + 'Создание новой новости', 'update' => 'Редактирование новости']; + + public function form(?string $id = null, array $data = []): array { + $model = Publication::byUuid($id)->first(); + $groups = [ + ['name' => 'common', 'fields' => $this->commonGroupFields($model)] + ]; + return ['title' => $this->formTitle($model), 'data' => $groups]; + } + + public function commonGroupFields(?Publication $model): array { + $fields = [ + [ + 'name' => 'name', + 'title' => 'Название', + 'type' => FieldType::STRING, + 'required' => true, + 'value' => $model->name ?? null + ], + [ + 'name' => 'excerpt', + 'title' => 'Краткое описание', + 'type' => FieldType::TEXT, + 'required' => true, + 'value' => $model->excerpt ?? null + ], + [ + 'name' => 'description', + 'title' => 'Описание', + 'type' => FieldType::HTML, + 'value' => $model->description ?? null + ], + [ + 'name' => 'poster_id', + 'title' => 'Фотография профиля', + 'type' => FieldType::IMAGE, + 'value' => ($model->poster ?? null) ? fractal($model->poster, new AssetTransformer()) : null + ] + ]; + return ['data' => $fields]; + } + + + + public function store(array $data): ?JsonResponse { + if (!empty($data['attach']['page_slug'])) { + $page = Page::query()->where(['slug' => $data['attach']['page_slug']])->first(); + $data['page_id'] = $page->id; + } + $data['user_id'] = Auth::user()->id; + $data['slug'] = Str::slug(Str::transliterate($data['name'])); + $data['type'] = PublicationType::NEWS; + if (!empty($data['poster_id'])) { + $asset = Asset::query()->where(['uuid' => $data['poster_id']])->first(); + $data['poster_id'] = $asset->id; + } + unset($data['attach']); + $model = Publication::create($data, true); + return fractal($model, new PublicationTransformer())->respond(); + } + + public function update(string $id, array $data): ?JsonResponse { + $model = Publication::byUuid($id)->firstOrFail(); + if (!empty($data['poster_id'])) { + $asset = Asset::query()->where(['uuid' => $data['poster_id']])->first(); + $data['poster_id'] = $asset->id; + } + $model->update($data); + return fractal($model->fresh(), new PublicationTransformer())->respond(); + } +} diff --git a/app/Services/Forms/Publications/PublicationFormsServices.php b/app/Services/Forms/Publications/PublicationFormsServices.php new file mode 100644 index 0000000..d0074e1 --- /dev/null +++ b/app/Services/Forms/Publications/PublicationFormsServices.php @@ -0,0 +1,9 @@ + PublicationForms::class + ]; +} diff --git a/app/Transformers/Publications/PublicationTransformer.php b/app/Transformers/Publications/PublicationTransformer.php index d1f6abe..e795b78 100644 --- a/app/Transformers/Publications/PublicationTransformer.php +++ b/app/Transformers/Publications/PublicationTransformer.php @@ -30,6 +30,7 @@ class PublicationTransformer extends TransformerAbstract { 'type' => $model->parsedType, 'name' => $model->name, 'excerpt' => $model->excerpt, + 'description' => $model->description, 'is_published' => boolval($model->is_published), 'created_at' => $model->created_at ? $model->created_at->toIso8601String() : null, 'updated_at' => $model->updated_at ? $model->updated_at->toIso8601String() : null diff --git a/database/migrations/2023_06_21_071812_add_description_to_publications_table.php b/database/migrations/2023_06_21_071812_add_description_to_publications_table.php new file mode 100644 index 0000000..b3aec44 --- /dev/null +++ b/database/migrations/2023_06_21_071812_add_description_to_publications_table.php @@ -0,0 +1,32 @@ +addColumn('text', 'description')->after('excerpt')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('publications', function (Blueprint $table) { + $table->dropColumn('description'); + }); + } +} diff --git a/routes/api.php b/routes/api.php index 3a689d7..bd62a53 100644 --- a/routes/api.php +++ b/routes/api.php @@ -56,4 +56,7 @@ Route::group(['middleware' => ['auth:api']], function() { Route::get('filters/{type}', 'Api\Forms\FormsController@filters'); Route::get('dadata/{inn}', 'Api\Companies\CompaniesController@getDataByInn'); + + Route::put('publications/published/{id}', 'Api\Publications\PublicationsController@published'); + Route::delete('publications/{id}', 'Api\Publications\PublicationsController@destroy'); });