Enforce unique slugs

closes flarum/core#393
This commit is contained in:
Toby Zerner 2015-10-19 16:50:19 +10:30
parent 244b8fd132
commit bf04dba33e
6 changed files with 54 additions and 9 deletions

View File

@ -27,8 +27,4 @@ return function (Dispatcher $events) {
$events->subscribe(Access\DiscussionPolicy::class); $events->subscribe(Access\DiscussionPolicy::class);
$events->subscribe(Access\TagPolicy::class); $events->subscribe(Access\TagPolicy::class);
$events->subscribe(Access\FlagPolicy::class); $events->subscribe(Access\FlagPolicy::class);
Tag::saving(function ($model) {
$this->app->make('Flarum\Tags\TagValidator')->assertValid($model);
});
}; };

View File

@ -101,9 +101,9 @@ export default class EditTagModal extends Modal {
isHidden: this.isHidden() isHidden: this.isHidden()
}).then( }).then(
() => this.hide(), () => this.hide(),
() => { response => {
this.loading = false; this.loading = false;
m.redraw(); this.handleErrors(response);
} }
); );
} }

View File

@ -0,0 +1,23 @@
<?php
namespace Flarum\Tags\Migration;
use Flarum\Database\AbstractMigration;
use Illuminate\Database\Schema\Blueprint;
class MakeSlugUnique extends AbstractMigration
{
public function up()
{
$this->schema->table('tags', function (Blueprint $table) {
$table->unique('slug');
});
}
public function down()
{
$this->schema->table('tags', function (Blueprint $table) {
$table->dropUnique('tags_slug_unique');
});
}
}

View File

@ -12,11 +12,25 @@ namespace Flarum\Tags\Command;
use Flarum\Core\Access\AssertPermissionTrait; use Flarum\Core\Access\AssertPermissionTrait;
use Flarum\Tags\Tag; use Flarum\Tags\Tag;
use Flarum\Tags\TagValidator;
class CreateTagHandler class CreateTagHandler
{ {
use AssertPermissionTrait; use AssertPermissionTrait;
/**
* @var TagValidator
*/
protected $validator;
/**
* @param TagValidator $validator
*/
public function __construct(TagValidator $validator)
{
$this->validator = $validator;
}
/** /**
* @param CreateTag $command * @param CreateTag $command
* @return Tag * @return Tag
@ -36,6 +50,8 @@ class CreateTagHandler
array_get($data, 'attributes.isHidden') array_get($data, 'attributes.isHidden')
); );
$this->validator->assertValid($tag->getAttributes());
$tag->save(); $tag->save();
return $tag; return $tag;

View File

@ -12,6 +12,7 @@ namespace Flarum\Tags\Command;
use Flarum\Core\Access\AssertPermissionTrait; use Flarum\Core\Access\AssertPermissionTrait;
use Flarum\Tags\TagRepository; use Flarum\Tags\TagRepository;
use Flarum\Tags\TagValidator;
class EditTagHandler class EditTagHandler
{ {
@ -23,11 +24,18 @@ class EditTagHandler
protected $tags; protected $tags;
/** /**
* @param TagRepository $tags * @var TagValidator
*/ */
public function __construct(TagRepository $tags) protected $validator;
/**
* @param TagRepository $tags
* @param TagValidator $validator
*/
public function __construct(TagRepository $tags, TagValidator $validator)
{ {
$this->tags = $tags; $this->tags = $tags;
$this->validator = $validator;
} }
/** /**
@ -70,6 +78,8 @@ class EditTagHandler
$tag->is_restricted = (bool) $attributes['isRestricted']; $tag->is_restricted = (bool) $attributes['isRestricted'];
} }
$this->validator->assertValid($tag->getDirty());
$tag->save(); $tag->save();
return $tag; return $tag;

View File

@ -19,6 +19,6 @@ class TagValidator extends AbstractValidator
*/ */
protected $rules = [ protected $rules = [
'name' => ['required'], 'name' => ['required'],
'slug' => ['required', 'unique:slug'] 'slug' => ['required', 'unique:tags']
]; ];
} }