diff --git a/app/Http/Controllers/ComputerScienceResourceController.php b/app/Http/Controllers/ComputerScienceResourceController.php index 956b5896..8806c8e7 100644 --- a/app/Http/Controllers/ComputerScienceResourceController.php +++ b/app/Http/Controllers/ComputerScienceResourceController.php @@ -110,15 +110,16 @@ public function store(StoreResourceRequest $request) Log::debug('Created resource '.json_encode($resource)); - return redirect(route('resources.show', ['computerScienceResource' => $resource->id])) + return redirect(route('resources.show', ['slug' => $resource->slug])) ->with('success', 'Created Resource Succesfully!'); } /** * Display the specified resource. */ - public function show(Request $request, ComputerScienceResource $computerScienceResource, string $tab = 'reviews') + public function show(Request $request, string $slug, string $tab = 'reviews') { + $computerScienceResource = ComputerScienceResource::where('slug', $slug)->firstOrFail(); // Get the review summaries $computerScienceResource->load('reviewSummary'); $computerScienceResource->load('user'); @@ -128,7 +129,7 @@ public function show(Request $request, ComputerScienceResource $computerScienceR if (! in_array($tab, $validTabs)) { // Redirect to default if invalid return redirect()->route('resources.show', [ - 'computerScienceResource' => $computerScienceResource->id, + 'slug' => $computerScienceResource->slug, 'tab' => 'reviews', ]); } diff --git a/app/Http/Controllers/ResourceEditsController.php b/app/Http/Controllers/ResourceEditsController.php index 23bd12d1..a5fc6bd3 100644 --- a/app/Http/Controllers/ResourceEditsController.php +++ b/app/Http/Controllers/ResourceEditsController.php @@ -16,19 +16,16 @@ class ResourceEditsController extends Controller { - private DataNormalizationService $dataService; - public function __construct( private DataNormalizationService $dataNormalizationService - ) { - $this->dataService = $dataNormalizationService; - } + ) { } /** * Return the form to create a edit. */ - public function create(ComputerScienceResource $computerScienceResource) + public function create(string $slug) { + $computerScienceResource = ComputerScienceResource::where('slug', $slug)->firstOrFail(); $computerScienceResource->load('user'); return Inertia::render('ResourceEdits/Create', [ @@ -69,7 +66,7 @@ public function store(ComputerScienceResource $computerScienceResource, StoreRes 'proposed_changes' => $actualChanges, ]); - return redirect()->route('resource_edits.show', ['resourceEdits' => $resourceEdit->id]) + return redirect()->route('resource_edits.show', ['slug' => $resourceEdit->slug]) ->with('success', 'The proposed edits were created. Others can now view it.'); } @@ -92,8 +89,10 @@ private function calculateChanges(ComputerScienceResource $resource, array $prop return $actualChanges; } - public function show(ResourceEdits $resourceEdits) + public function show(string $slug) { + $resourceEdits = ResourceEdits::where('slug', $slug)->firstOrFail(); + $resourceEdits->load('resource'); $resourceEdits->load('user'); @@ -160,7 +159,7 @@ public function merge(ResourceEditsService $editsService, ResourceEdits $resourc // Delete the edit since we successfully merged the changes $resourceEdits->delete(); - return redirect(route('resources.show', ['computerScienceResource' => $resourceEdits->computer_science_resource_id])) + return redirect(route('resources.show', ['slug' => $resource->slug])) ->with('success', 'Successfully merged new changed!'); } } diff --git a/app/Models/ComputerScienceResource.php b/app/Models/ComputerScienceResource.php index 771714bd..221e4dbd 100644 --- a/app/Models/ComputerScienceResource.php +++ b/app/Models/ComputerScienceResource.php @@ -14,14 +14,16 @@ use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Support\Facades\Storage; use Spatie\Tags\HasTags; +use Cviebrock\EloquentSluggable\Sluggable; #[ObservedBy([ComputerScienceResourceObserver::class])] class ComputerScienceResource extends Model { + use HasFactory; + use Sluggable; + use HasComments; - /** @use HasFactory<\Database\Factories\ComputerScienceResourceFactory> */ - use HasFactory; use HasTags; use HasVotes; @@ -31,6 +33,20 @@ class ComputerScienceResource extends Model protected $appends = ['topic_tags', 'programming_language_tags', 'general_tags', 'vote_score', 'user_vote', 'comments_count', 'image_url']; + /** + * Return the sluggable configuration array for this model. + * + * @return array + */ + public function sluggable(): array + { + return [ + 'slug' => [ + 'source' => 'name' + ] + ]; + } + public function user(): BelongsTo { return $this->belongsTo(User::class); diff --git a/app/Models/ResourceEdits.php b/app/Models/ResourceEdits.php index 1766c2fd..f05d75c3 100644 --- a/app/Models/ResourceEdits.php +++ b/app/Models/ResourceEdits.php @@ -14,11 +14,13 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; use ShiftOneLabs\LaravelCascadeDeletes\CascadesDeletes; +use Cviebrock\EloquentSluggable\Sluggable; #[ObservedBy([ResourceEditsObserver::class])] class ResourceEdits extends Model { use CascadesDeletes; + use Sluggable; use HasComments; /** @use HasFactory<\Database\Factories\ResourceEditsFactory> */ @@ -37,6 +39,20 @@ class ResourceEdits extends Model 'proposed_changes' => 'array', ]; + /** + * Return the sluggable configuration array for this model. + * + * @return array + */ + public function sluggable(): array + { + return [ + 'slug' => [ + 'source' => 'edit_title' + ] + ]; + } + public function resource(): BelongsTo { return $this->belongsTo(ComputerScienceResource::class, 'computer_science_resource_id', 'id'); diff --git a/composer.json b/composer.json index 17b82b48..6193d31f 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "license": "MIT", "require": { "php": "^8.2", + "cviebrock/eloquent-sluggable": "^11.0", "inertiajs/inertia-laravel": "^2.0", "joelbutcher/socialstream": "^6.2", "laravel/framework": "^11.31", diff --git a/composer.lock b/composer.lock index 3380bfbf..64b322fc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "42cee1297eabe050f6a451aef2908c3b", + "content-hash": "221a502645753e2ec18df636c08462d0", "packages": [ { "name": "bacon/bacon-qr-code", @@ -189,6 +189,154 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "cocur/slugify", + "version": "v4.6.0", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb", + "reference": "1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "symfony/config": "<3.4 || >=4,<4.3", + "symfony/dependency-injection": "<3.4 || >=4,<4.3", + "symfony/http-kernel": "<3.4 || >=4,<4.3", + "twig/twig": "<2.12.1" + }, + "require-dev": { + "laravel/framework": "^5.0|^6.0|^7.0|^8.0", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6.8", + "mockery/mockery": "^1.3", + "nette/di": "~2.4", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "symfony/config": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0", + "twig/twig": "^2.12.1 || ~3.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + }, + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + } + ], + "description": "Converts a string into a slug.", + "keywords": [ + "slug", + "slugify" + ], + "support": { + "issues": "https://github.com/cocur/slugify/issues", + "source": "https://github.com/cocur/slugify/tree/v4.6.0" + }, + "time": "2024-09-10T14:09:25+00:00" + }, + { + "name": "cviebrock/eloquent-sluggable", + "version": "11.0.1", + "source": { + "type": "git", + "url": "https://github.com/cviebrock/eloquent-sluggable.git", + "reference": "a4281cf0284a21efc1031a065b112ddd6c826eea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cviebrock/eloquent-sluggable/zipball/a4281cf0284a21efc1031a065b112ddd6c826eea", + "reference": "a4281cf0284a21efc1031a065b112ddd6c826eea", + "shasum": "" + }, + "require": { + "cocur/slugify": "^4.3", + "illuminate/config": "^11.0", + "illuminate/database": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "require-dev": { + "mockery/mockery": "^1.4.4", + "orchestra/testbench": "^9.0", + "pestphp/pest": "^2.28" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Cviebrock\\EloquentSluggable\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "11.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cviebrock\\EloquentSluggable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Colin Viebrock", + "email": "colin@viebrock.ca" + } + ], + "description": "Easy creation of slugs for your Eloquent models in Laravel", + "homepage": "https://github.com/cviebrock/eloquent-sluggable", + "keywords": [ + "eloquent", + "eloquent-sluggable", + "laravel", + "lumen", + "slug", + "sluggable" + ], + "support": { + "issues": "https://github.com/cviebrock/eloquent-sluggable/issues", + "source": "https://github.com/cviebrock/eloquent-sluggable/tree/11.0.1" + }, + "funding": [ + { + "url": "https://github.com/cviebrock", + "type": "github" + } + ], + "time": "2024-11-29T01:32:17+00:00" + }, { "name": "dasprid/enum", "version": "1.0.6", diff --git a/config/computerScienceResource.php b/config/computerScienceResource.php index 80ca81d6..bc587fec 100644 --- a/config/computerScienceResource.php +++ b/config/computerScienceResource.php @@ -2,6 +2,6 @@ return [ 'platforms' => ['book', 'podcast', 'youtube_channel', 'blog', 'website', 'organization', 'service', 'bootcamp', 'newsletter', 'workshop', 'course', 'forum', 'mobile_app', 'desktop_app', 'magazine'], - 'difficulties' => ['beginner', 'industry_simple', 'industry_standard', 'industry_professional', 'academic'], + 'difficulties' => ['children', 'beginner', 'industry_simple', 'industry_standard', 'industry_professional', 'academic'], 'pricings' => ['free', 'paid', 'freemium'], ]; diff --git a/database/migrations/2025_01_24_171530_create_computer_science_resources_table.php b/database/migrations/2025_01_24_171530_create_computer_science_resources_table.php index 9e5ccf9a..60b8cff3 100644 --- a/database/migrations/2025_01_24_171530_create_computer_science_resources_table.php +++ b/database/migrations/2025_01_24_171530_create_computer_science_resources_table.php @@ -15,7 +15,7 @@ public function up(): void if (! Schema::hasTable('computer_science_resources')) { Schema::create('computer_science_resources', function (Blueprint $table) { $table->id(); - + $table->string('slug')->unique(); // User who posted $table->foreignIdFor(User::class); @@ -28,7 +28,7 @@ public function up(): void $table->set('platforms', ['book', 'podcast', 'youtube_channel', 'blog', 'website', 'organization', 'service', 'bootcamp', 'newsletter', 'workshop', 'course', 'forum', 'mobile_app', 'desktop_app', 'magazine']) ->index(); - $table->enum('difficulty', ['beginner', 'industry_simple', 'industry_standard', 'industry_professional', 'academic']) + $table->enum('difficulty', ['children', 'beginner', 'industry_simple', 'industry_standard', 'industry_professional', 'academic']) ->index(); $table->enum('pricing', ['free', 'premium', 'paid', 'freemium']) ->index(); diff --git a/database/migrations/2025_03_24_154128_create_resource_edits_table.php b/database/migrations/2025_03_24_154128_create_resource_edits_table.php index a1174203..93227230 100644 --- a/database/migrations/2025_03_24_154128_create_resource_edits_table.php +++ b/database/migrations/2025_03_24_154128_create_resource_edits_table.php @@ -15,6 +15,7 @@ public function up(): void { Schema::create('resource_edits', function (Blueprint $table) { $table->id(); + $table->string('slug')->unique(); $table->timestamps(); // The resource we are editting diff --git a/resources/js/Components/Comments/SortUpvotesByDropdown.vue b/resources/js/Components/Comments/SortUpvotesByDropdown.vue index 0f6dda9c..a9ce3056 100644 --- a/resources/js/Components/Comments/SortUpvotesByDropdown.vue +++ b/resources/js/Components/Comments/SortUpvotesByDropdown.vue @@ -1,6 +1,6 @@