From 7ad8e464ac20ecef3d6fa16fb3660860b0855f44 Mon Sep 17 00:00:00 2001 From: Josh Torres Date: Wed, 4 Oct 2023 15:21:52 -0700 Subject: [PATCH] move files from main repo --- src/Config/.gitkeep | 0 src/Config/config.php | 5 + src/Console/.gitkeep | 0 src/Database/Migrations/.gitkeep | 0 ...2022_07_29_183304_create_reviews_table.php | 41 ++++++ src/Database/Seeders/.gitkeep | 0 src/Database/Seeders/ReviewTableSeeder.php | 29 ++++ .../Seeders/ReviewsDatabaseSeeder.php | 21 +++ src/Database/factories/.gitkeep | 0 src/Database/factories/ReviewFactory.php | 36 +++++ src/Emails/.gitkeep | 0 src/Events/.gitkeep | 0 src/Http/Controllers/.gitkeep | 0 src/Http/Controllers/ReviewsController.php | 84 ++++++++++++ src/Http/Livewire/CreateReviewModal.php | 129 ++++++++++++++++++ src/Http/Livewire/ReviewCard.php | 24 ++++ src/Http/Livewire/ReviewList.php | 42 ++++++ src/Http/Middleware/.gitkeep | 0 src/Http/Requests/.gitkeep | 0 src/Jobs/.gitkeep | 0 src/Listeners/.gitkeep | 0 src/Models/.gitkeep | 0 src/Models/Review.php | 46 +++++++ src/Notifications/.gitkeep | 0 src/Policies/.gitkeep | 0 src/Policies/ReviewPolicy.php | 120 ++++++++++++++++ src/Providers/.gitkeep | 0 src/Providers/ReviewsServiceProvider.php | 113 +++++++++++++++ src/Providers/RouteServiceProvider.php | 69 ++++++++++ src/Repositories/.gitkeep | 0 src/Resources/assets/.gitkeep | 0 src/Resources/assets/js/app.js | 0 src/Resources/assets/sass/app.scss | 0 src/Resources/lang/.gitkeep | 0 src/Resources/views/.gitkeep | 0 src/Resources/views/components/.gitkeep | 0 src/Resources/views/index.blade.php | 9 ++ src/Resources/views/layouts/master.blade.php | 19 +++ .../livewire/create-review-modal.blade.php | 24 ++++ .../views/livewire/review-card.blade.php | 59 ++++++++ .../views/livewire/review-list.blade.php | 20 +++ src/Routes/.gitkeep | 0 src/Routes/api.php | 18 +++ src/Routes/web.php | 16 +++ src/Rules/.gitkeep | 0 src/Tests/Feature/.gitkeep | 0 src/Tests/Unit/.gitkeep | 0 src/Traits/Reviewable.php | 32 +++++ src/Transformers/.gitkeep | 0 src/View/Component/.gitkeep | 0 50 files changed, 956 insertions(+) create mode 100644 src/Config/.gitkeep create mode 100644 src/Config/config.php create mode 100644 src/Console/.gitkeep create mode 100644 src/Database/Migrations/.gitkeep create mode 100644 src/Database/Migrations/2022_07_29_183304_create_reviews_table.php create mode 100644 src/Database/Seeders/.gitkeep create mode 100644 src/Database/Seeders/ReviewTableSeeder.php create mode 100644 src/Database/Seeders/ReviewsDatabaseSeeder.php create mode 100644 src/Database/factories/.gitkeep create mode 100644 src/Database/factories/ReviewFactory.php create mode 100644 src/Emails/.gitkeep create mode 100644 src/Events/.gitkeep create mode 100644 src/Http/Controllers/.gitkeep create mode 100644 src/Http/Controllers/ReviewsController.php create mode 100644 src/Http/Livewire/CreateReviewModal.php create mode 100644 src/Http/Livewire/ReviewCard.php create mode 100644 src/Http/Livewire/ReviewList.php create mode 100644 src/Http/Middleware/.gitkeep create mode 100644 src/Http/Requests/.gitkeep create mode 100644 src/Jobs/.gitkeep create mode 100644 src/Listeners/.gitkeep create mode 100644 src/Models/.gitkeep create mode 100644 src/Models/Review.php create mode 100644 src/Notifications/.gitkeep create mode 100644 src/Policies/.gitkeep create mode 100644 src/Policies/ReviewPolicy.php create mode 100644 src/Providers/.gitkeep create mode 100644 src/Providers/ReviewsServiceProvider.php create mode 100644 src/Providers/RouteServiceProvider.php create mode 100644 src/Repositories/.gitkeep create mode 100644 src/Resources/assets/.gitkeep create mode 100644 src/Resources/assets/js/app.js create mode 100644 src/Resources/assets/sass/app.scss create mode 100644 src/Resources/lang/.gitkeep create mode 100644 src/Resources/views/.gitkeep create mode 100644 src/Resources/views/components/.gitkeep create mode 100644 src/Resources/views/index.blade.php create mode 100644 src/Resources/views/layouts/master.blade.php create mode 100644 src/Resources/views/livewire/create-review-modal.blade.php create mode 100644 src/Resources/views/livewire/review-card.blade.php create mode 100644 src/Resources/views/livewire/review-list.blade.php create mode 100644 src/Routes/.gitkeep create mode 100644 src/Routes/api.php create mode 100644 src/Routes/web.php create mode 100644 src/Rules/.gitkeep create mode 100644 src/Tests/Feature/.gitkeep create mode 100644 src/Tests/Unit/.gitkeep create mode 100644 src/Traits/Reviewable.php create mode 100644 src/Transformers/.gitkeep create mode 100644 src/View/Component/.gitkeep diff --git a/src/Config/.gitkeep b/src/Config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Config/config.php b/src/Config/config.php new file mode 100644 index 0000000..a2fb83f --- /dev/null +++ b/src/Config/config.php @@ -0,0 +1,5 @@ + 'Reviews', +]; diff --git a/src/Console/.gitkeep b/src/Console/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Database/Migrations/.gitkeep b/src/Database/Migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Database/Migrations/2022_07_29_183304_create_reviews_table.php b/src/Database/Migrations/2022_07_29_183304_create_reviews_table.php new file mode 100644 index 0000000..69eb21f --- /dev/null +++ b/src/Database/Migrations/2022_07_29_183304_create_reviews_table.php @@ -0,0 +1,41 @@ +id(); + $table->foreignIdFor(User::class, 'user_id')->index(); + $table->nullableMorphs('reviewable'); + $table->text('body'); + $table->integer('visibility')->default(1); + $table->foreignIdFor(Language::class, 'language_id')->index()->default(1); + $table->boolean('received_product_free')->default(false); + $table->boolean('recommend')->default(false); + $table->boolean('commentable')->default(true); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('reviews'); + } +} diff --git a/src/Database/Seeders/.gitkeep b/src/Database/Seeders/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Database/Seeders/ReviewTableSeeder.php b/src/Database/Seeders/ReviewTableSeeder.php new file mode 100644 index 0000000..3b618db --- /dev/null +++ b/src/Database/Seeders/ReviewTableSeeder.php @@ -0,0 +1,29 @@ +create(); + + // Review Comments + Post::factory(15)->create([ + 'postable_id' => Review::all()->random()->id, + 'postable_type' => Review::class, + ]); + } +} diff --git a/src/Database/Seeders/ReviewsDatabaseSeeder.php b/src/Database/Seeders/ReviewsDatabaseSeeder.php new file mode 100644 index 0000000..963170a --- /dev/null +++ b/src/Database/Seeders/ReviewsDatabaseSeeder.php @@ -0,0 +1,21 @@ +call(ReviewTableSeeder::class); + } +} diff --git a/src/Database/factories/.gitkeep b/src/Database/factories/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Database/factories/ReviewFactory.php b/src/Database/factories/ReviewFactory.php new file mode 100644 index 0000000..5482da6 --- /dev/null +++ b/src/Database/factories/ReviewFactory.php @@ -0,0 +1,36 @@ +random()->load('users'); + + return [ + 'user_id' => $team->users->random()->id, + 'reviewable_id' => $team->id, + 'reviewable_type' => $team::class, + 'body' => $this->faker->paragraph(4), + 'created_at' => now(), + 'updated_at' => now(), + ]; + } +} diff --git a/src/Emails/.gitkeep b/src/Emails/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Events/.gitkeep b/src/Events/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Http/Controllers/.gitkeep b/src/Http/Controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Http/Controllers/ReviewsController.php b/src/Http/Controllers/ReviewsController.php new file mode 100644 index 0000000..57ffabb --- /dev/null +++ b/src/Http/Controllers/ReviewsController.php @@ -0,0 +1,84 @@ +model = $model; + } + + public function openReviewModal() + { + if ($this->model->reviewedBy(auth()->user())) { + $this->review = $this->model->getCurrentUserReview(); + + $this->form->fill([ + 'body' => $this->review->body, + 'visibility' => $this->review->visibility, + 'language_id' => $this->review->language_id, + 'commentable' => $this->review->commentable, + 'received_product_free' => $this->review->received_product_free, + 'recommend' => $this->review->recommend, + ]); + } else { + $this->form->fill(); + } + + $this->dispatch('review-modal-' . $this->model->id, type: 'open'); + } + + public function createReview() + { + if ($this->model->reviewedBy(auth()->user())) { + $this->review->update( + $this->form->getState() + ); + + $this->dispatch('reviewUpdated')->to('reviews::review-card'); + $this->dispatch('notify', message: Translate::get('Review updated'), type: 'success'); + } else { + $this->review = $this->model->reviews()->create( + array_merge(['user_id' => auth()->id()], $this->form->getState()) + ); + + $this->dispatch('notify', message: Translate::get('Review created'), type: 'success'); + } + + $this->dispatch('updateReviews', review: $this->review); + $this->closeModal('review-modal-' . $this->model->id); + $this->reset('body', 'visibility', 'language_id', 'commentable', 'received_product_free', 'recommend'); + } + + public function removeReview() + { + if ($this->model->reviewedBy(auth()->user())) { + $this->review->delete(); + + $this->dispatch('notify', message: Translate::get('Review removed'), type: 'success'); + + $this->dispatch('updateReviews'); + $this->closeModal('review-modal-' . $this->model->id); + $this->reset('body', 'visibility', 'language_id', 'commentable', 'received_product_free', 'recommend'); + } + } + + public function render() + { + return view('reviews::livewire.create-review-modal'); + } + + protected function getFormSchema(): array + { + return [ + Textarea::make('body')->required(), + Select::make('visibility') + ->options([ + 0 => 'Public', + 1 => 'Friends Only', + ]) + ->default(0) + ->disablePlaceholderSelection() + ->required(), + Select::make('language_id') + ->label('Language') + ->options(Language::pluck('name', 'id')) + ->default(1) + ->disablePlaceholderSelection() + ->required(), + Checkbox::make('commentable') + ->default(1) + ->label('Allow Comments'), + Checkbox::make('received_product_free') + ->default(0) + ->label('Check this box if you joined for free'), + Radio::make('recommend') + ->label(Translate::get('Do you recommend this Team?')) + ->boolean() + ->required(), + ]; + } +} diff --git a/src/Http/Livewire/ReviewCard.php b/src/Http/Livewire/ReviewCard.php new file mode 100644 index 0000000..d8c52e3 --- /dev/null +++ b/src/Http/Livewire/ReviewCard.php @@ -0,0 +1,24 @@ + '$refresh']; + + public function mount(Review $review) + { + $this->review = $review; + $this->review->load('user'); + } + + public function render() + { + return view('reviews::livewire.review-card'); + } +} diff --git a/src/Http/Livewire/ReviewList.php b/src/Http/Livewire/ReviewList.php new file mode 100644 index 0000000..b024100 --- /dev/null +++ b/src/Http/Livewire/ReviewList.php @@ -0,0 +1,42 @@ + '$refresh']; + + public function mount($model) + { + $this->model = $model; + } + + public function updateReviews(Review $review) + { + $this->latestReview = $review; + } + + public function getRowsQueryProperty() + { + return $this->model->reviews()->latest(); + } + + public function getRowsProperty() + { + return $this->rowsQuery->get(); + } + + public function render() + { + return view('reviews::livewire.review-list', [ + 'reviews' => $this->rows, + ]); + } +} diff --git a/src/Http/Middleware/.gitkeep b/src/Http/Middleware/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Http/Requests/.gitkeep b/src/Http/Requests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Jobs/.gitkeep b/src/Jobs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Listeners/.gitkeep b/src/Listeners/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Models/.gitkeep b/src/Models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Models/Review.php b/src/Models/Review.php new file mode 100644 index 0000000..d684437 --- /dev/null +++ b/src/Models/Review.php @@ -0,0 +1,46 @@ + 'boolean', + 'recommend' => 'boolean', + 'commentable' => 'boolean', + ]; + + protected static function newFactory() + { + return ReviewFactory::new(); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function language(): BelongsTo + { + return $this->belongsTo(Language::class); + } + + public function reviewable(): MorphTo + { + return $this->morphTo(); + } +} diff --git a/src/Notifications/.gitkeep b/src/Notifications/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Policies/.gitkeep b/src/Policies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Policies/ReviewPolicy.php b/src/Policies/ReviewPolicy.php new file mode 100644 index 0000000..5d55b6c --- /dev/null +++ b/src/Policies/ReviewPolicy.php @@ -0,0 +1,120 @@ +is_admin) { + return true; + } + } + + /** + * Determine whether the user can view any models. + */ + public function viewAny(User $user): bool + { + return $user->can('view_any_review'); + } + + /** + * Determine whether the user can view the model. + */ + public function view(User $user, Review $review): bool + { + return $user->can('view_review'); + } + + /** + * Determine whether the user can create models. + */ + public function create(User $user): bool + { + return $user->can('create_review'); + } + + /** + * Determine whether the user can update the model. + */ + public function update(User $user, Review $review): bool + { + return $user->can('update_review'); + } + + /** + * Determine whether the user can delete the model. + */ + public function delete(User $user, Review $review): bool + { + return $user->can('delete_review'); + } + + /** + * Determine whether the user can bulk delete. + */ + public function deleteAny(User $user): bool + { + return $user->can('delete_any_review'); + } + + /** + * Determine whether the user can permanently delete. + */ + public function forceDelete(User $user, Review $review): bool + { + return $user->can('force_delete_review'); + } + + /** + * Determine whether the user can permanently bulk delete. + */ + public function forceDeleteAny(User $user): bool + { + return $user->can('force_delete_any_review'); + } + + /** + * Determine whether the user can restore. + */ + public function restore(User $user, Review $review): bool + { + return $user->can('restore_review'); + } + + /** + * Determine whether the user can bulk restore. + */ + public function restoreAny(User $user): bool + { + return $user->can('restore_any_review'); + } + + /** + * Determine whether the user can replicate. + */ + public function replicate(User $user, Review $review): bool + { + return $user->can('replicate_review'); + } + + /** + * Determine whether the user can reorder. + */ + public function reorder(User $user): bool + { + return $user->can('reorder_review'); + } +} diff --git a/src/Providers/.gitkeep b/src/Providers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Providers/ReviewsServiceProvider.php b/src/Providers/ReviewsServiceProvider.php new file mode 100644 index 0000000..e7d85f5 --- /dev/null +++ b/src/Providers/ReviewsServiceProvider.php @@ -0,0 +1,113 @@ +registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations')); + } + + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $langPath = resource_path('lang/modules/' . $this->moduleNameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->moduleNameLower); + } else { + $this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower); + } + } + + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = resource_path('views/modules/' . $this->moduleNameLower); + + $sourcePath = module_path($this->moduleName, 'Resources/views'); + + $this->publishes([ + $sourcePath => $viewPath, + ], ['views', $this->moduleNameLower . '-module-views']); + + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->register(RouteServiceProvider::class); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } + + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'), + ], 'config'); + $this->mergeConfigFrom( + module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower + ); + } + + private function getPublishableViewPaths(): array + { + $paths = []; + foreach (Config::get('view.paths') as $path) { + if (is_dir($path . '/modules/' . $this->moduleNameLower)) { + $paths[] = $path . '/modules/' . $this->moduleNameLower; + } + } + + return $paths; + } +} diff --git a/src/Providers/RouteServiceProvider.php b/src/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..7e4af7b --- /dev/null +++ b/src/Providers/RouteServiceProvider.php @@ -0,0 +1,69 @@ +mapApiRoutes(); + + $this->mapWebRoutes(); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApiRoutes() + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->moduleNamespace) + ->group(module_path('Reviews', '/Routes/api.php')); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::middleware('web') + ->namespace($this->moduleNamespace) + ->group(module_path('Reviews', '/Routes/web.php')); + } +} diff --git a/src/Repositories/.gitkeep b/src/Repositories/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Resources/assets/.gitkeep b/src/Resources/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Resources/assets/js/app.js b/src/Resources/assets/js/app.js new file mode 100644 index 0000000..e69de29 diff --git a/src/Resources/assets/sass/app.scss b/src/Resources/assets/sass/app.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/Resources/lang/.gitkeep b/src/Resources/lang/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Resources/views/.gitkeep b/src/Resources/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Resources/views/components/.gitkeep b/src/Resources/views/components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Resources/views/index.blade.php b/src/Resources/views/index.blade.php new file mode 100644 index 0000000..2ab9162 --- /dev/null +++ b/src/Resources/views/index.blade.php @@ -0,0 +1,9 @@ +@extends('reviews::layouts.master') + +@section('content') + Hello World + +

+ This view is loaded from module: {!! config('reviews.name') !!} +

+@endsection diff --git a/src/Resources/views/layouts/master.blade.php b/src/Resources/views/layouts/master.blade.php new file mode 100644 index 0000000..e6b2b96 --- /dev/null +++ b/src/Resources/views/layouts/master.blade.php @@ -0,0 +1,19 @@ + + + + + + + Module Reviews + + {{-- Laravel Mix - CSS File --}} + {{-- --}} + + + +@yield('content') + +{{-- Laravel Mix - JS File --}} +{{-- --}} + + diff --git a/src/Resources/views/livewire/create-review-modal.blade.php b/src/Resources/views/livewire/create-review-modal.blade.php new file mode 100644 index 0000000..3f5e333 --- /dev/null +++ b/src/Resources/views/livewire/create-review-modal.blade.php @@ -0,0 +1,24 @@ + + Review: {{ $model->name }} + + + {{ $this->form }} +
+ @auth + @if ($model->reviewedBy(auth()->user())) + {{ Translate::get('Delete Review') }} + {{ Translate::get('Update Review') }} + @else + {{ Translate::get('Create Review') }} + @endif + @endauth +
+
+
diff --git a/src/Resources/views/livewire/review-card.blade.php b/src/Resources/views/livewire/review-card.blade.php new file mode 100644 index 0000000..59cf985 --- /dev/null +++ b/src/Resources/views/livewire/review-card.blade.php @@ -0,0 +1,59 @@ +
+
+
+ {{ $review->user->name }} +
+
+

{{ $review->user->name }}

+

{{ $review->user->teams()->count() . Str::plural(Translate::get(" team"), $review->user->teams()->count()) }}

+

{{ $review->user->reviews()->count() . Str::plural(Translate::get(" review"), $review->user->reviews()->count()) }}

+
+
+
+
+
+ @if ($review->recommend) +
+ +
+
+

Recommended

+

Member + for {{ $review->reviewable->users()->where('users.id', $review->user_id)->first()?->membership->created_at->longAbsoluteDiffForHumans($review->created_at) }} + at review time

+
+ @endif +
+ @auth + @if (auth()->user()->is($review->user)) +
+ +
+ @endif + @endauth +
+
+

{{ $review->body }}

+
+
+

{{ Translate::get($review->likesCount() . ' ' . Str::plural('person', $review->likesCount()) . ' found this review helpful') }}

+
+

Helpful

+ +
+
+
+
diff --git a/src/Resources/views/livewire/review-list.blade.php b/src/Resources/views/livewire/review-list.blade.php new file mode 100644 index 0000000..98b858a --- /dev/null +++ b/src/Resources/views/livewire/review-list.blade.php @@ -0,0 +1,20 @@ +
+
+ {{ Translate::get('Reviews') }} ({{ $model->reviews()->count() }}) + @can('add-review', $model) + + {{ Translate::get('Add Review') }} + + @endcan +
+ @if ($latestReview) + + @endif + @foreach ($reviews as $review) + + @endforeach +
diff --git a/src/Routes/.gitkeep b/src/Routes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Routes/api.php b/src/Routes/api.php new file mode 100644 index 0000000..ad2a0bb --- /dev/null +++ b/src/Routes/api.php @@ -0,0 +1,18 @@ +get('/reviews', function (Request $request) { + return $request->user(); +}); diff --git a/src/Routes/web.php b/src/Routes/web.php new file mode 100644 index 0000000..0c3b68a --- /dev/null +++ b/src/Routes/web.php @@ -0,0 +1,16 @@ +prefix('reviews')->group(function () { +// Route::get('/', 'ReviewsController@index'); +}); diff --git a/src/Rules/.gitkeep b/src/Rules/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Tests/Feature/.gitkeep b/src/Tests/Feature/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Tests/Unit/.gitkeep b/src/Tests/Unit/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Traits/Reviewable.php b/src/Traits/Reviewable.php new file mode 100644 index 0000000..e839b72 --- /dev/null +++ b/src/Traits/Reviewable.php @@ -0,0 +1,32 @@ +reviews()->where('user_id', $user->id)->exists(); + } + + /** + * Get the model's reviews + */ + public function reviews() + { + return $this->morphMany(Review::class, 'reviewable'); + } + + public function getCurrentUserReview() + { + return $this->reviews()->where('user_id', auth()->id())->first() ?? null; + } + + public function recommendedCount() + { + return $this->reviews()->where('recommend', 1)->count(); + } +} diff --git a/src/Transformers/.gitkeep b/src/Transformers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/View/Component/.gitkeep b/src/View/Component/.gitkeep new file mode 100644 index 0000000..e69de29