diff --git a/database/2018_02_10_222914_create_sessions_table.php b/database/2018_02_10_222914_create_sessions_table.php index 8572f73c..e32f85ad 100644 --- a/database/2018_02_10_222914_create_sessions_table.php +++ b/database/2018_02_10_222914_create_sessions_table.php @@ -51,7 +51,6 @@ class CreateSessionsTable extends Migration public function down() { $schema = Database::connection()->getSchemaBuilder(); - $schema->drop('sessions'); $schema->table('users', function (Blueprint $table) { $table->integer('user_registered') @@ -61,5 +60,7 @@ class CreateSessionsTable extends Migration $table->dropSoftDeletes(); $table->dropTimestamps(); }); + + $schema->drop('sessions'); } } diff --git a/database/2018_02_11_135554_create_roles_tables.php b/database/2018_02_11_135554_create_roles_tables.php new file mode 100644 index 00000000..2d3e5891 --- /dev/null +++ b/database/2018_02_11_135554_create_roles_tables.php @@ -0,0 +1,90 @@ +getSchemaBuilder(); + $schema->create('roles', function (Blueprint $table) { + $table->increments('role_id'); + + $table->integer('role_hierarchy') + ->default(1); + + $table->string('role_name', 255); + + $table->string('role_title', 64) + ->nullable(); + + $table->text('role_description') + ->nullable(); + + $table->boolean('role_secret') + ->default(false); + + $table->integer('role_colour') + ->nullable() + ->default(null); + + $table->timestamps(); + }); + + $schema->create('user_roles', function (Blueprint $table) { + $table->integer('user_id') + ->unsigned(); + + $table->integer('role_id') + ->unsigned(); + + $table->primary(['user_id', 'role_id']); + + $table->foreign('user_id') + ->references('user_id') + ->on('users') + ->onUpdate('cascade') + ->onDelete('cascade'); + + $table->foreign('role_id') + ->references('role_id') + ->on('roles') + ->onUpdate('cascade') + ->onDelete('cascade'); + }); + + $schema->table('users', function (Blueprint $table) { + $table->integer('display_role') + ->unsigned() + ->nullable() + ->default(null); + + $table->foreign('display_role') + ->references('role_id') + ->on('roles') + ->onUpdate('cascade') + ->onDelete('set null'); + }); + } + + /** + * @SuppressWarnings(PHPMD) + */ + public function down() + { + $schema = Database::connection()->getSchemaBuilder(); + + $schema->table('users', function (Blueprint $table) { + $table->dropForeign(['display_role']); + $table->dropColumn('display_role'); + }); + + $schema->drop('user_roles'); + $schema->drop('roles'); + } +} diff --git a/src/Colour.php b/src/Colour.php index fb8ac695..5cd1436c 100644 --- a/src/Colour.php +++ b/src/Colour.php @@ -86,9 +86,9 @@ class Colour } } - public function __construct(int $raw) + public function __construct(?int $raw) { - $this->rawValue = $raw; + $this->rawValue = $raw ?? self::INHERIT; } public static function fromRGB(int $red, int $green, int $blue): Colour diff --git a/src/Users/Role.php b/src/Users/Role.php new file mode 100644 index 00000000..3d769ca7 --- /dev/null +++ b/src/Users/Role.php @@ -0,0 +1,14 @@ +hasMany(UserRole::class, 'role_id'); + } +} diff --git a/src/Users/User.php b/src/Users/User.php index 9a56516d..6de445f0 100644 --- a/src/Users/User.php +++ b/src/Users/User.php @@ -72,4 +72,9 @@ class User extends Model { return $this->hasMany(Session::class, 'user_id'); } + + public function roles() + { + return $this->hasMany(UserRole::class, 'user_id'); + } } diff --git a/src/Users/UserRole.php b/src/Users/UserRole.php new file mode 100644 index 00000000..7a3312dc --- /dev/null +++ b/src/Users/UserRole.php @@ -0,0 +1,21 @@ +belongsTo(User::class, 'user_id'); + } + + public function role() + { + return $this->belongsTo(Role::class, 'role_id'); + } +} diff --git a/tests/ColourTest.php b/tests/ColourTest.php index b7f12ba9..74be54d0 100644 --- a/tests/ColourTest.php +++ b/tests/ColourTest.php @@ -33,6 +33,18 @@ class ColourTest extends TestCase $this->assertEquals($colour->hex, '000000'); } + public function testNull() + { + $colour = new Colour(null); + + $this->assertTrue($colour->inherit); + $this->assertEquals($colour->raw, 0x40000000); + $this->assertEquals($colour->red, 0); + $this->assertEquals($colour->green, 0); + $this->assertEquals($colour->blue, 0); + $this->assertEquals($colour->hex, '000000'); + } + public function testFromRaw() { $colour = new Colour(static::RAW_HEX6);