From 50785e6ad5e7101fb6514d988013029326a7f5a5 Mon Sep 17 00:00:00 2001 From: Toy Rik Date: Wed, 4 Feb 2026 13:28:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D0=B8=20=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9,=20=D0=BC?= =?UTF-8?q?=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=20=D1=81?= =?UTF-8?q?=D0=B8=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 3 +- .../Http/Controllers/DashboardController.php | 10 ++++++ src/app/Http/Controllers/RoleController.php | 10 ++++++ src/app/Http/Controllers/UserController.php | 10 ++++++ src/app/Models/BaseModel.php | 29 +++++++++++++++ src/app/Models/Role.php | 27 ++++++++++++++ src/app/Models/User.php | 17 +++++++++ src/database/factories/RoleFactory.php | 23 ++++++++++++ .../2026_02_04_051435_create_roles_table.php | 30 ++++++++++++++++ ... 2026_02_04_051523_create_users_table.php} | 21 ++++------- src/database/seeders/DatabaseSeeder.php | 9 +++-- src/database/seeders/RoleSeeder.php | 35 +++++++++++++++++++ src/database/seeders/UserSeeder.php | 31 ++++++++++++++++ 13 files changed, 233 insertions(+), 22 deletions(-) create mode 100644 src/app/Http/Controllers/DashboardController.php create mode 100644 src/app/Http/Controllers/RoleController.php create mode 100644 src/app/Http/Controllers/UserController.php create mode 100644 src/app/Models/BaseModel.php create mode 100644 src/app/Models/Role.php create mode 100644 src/database/factories/RoleFactory.php create mode 100644 src/database/migrations/2026_02_04_051435_create_roles_table.php rename src/database/migrations/{0001_01_01_000000_create_users_table.php => 2026_02_04_051523_create_users_table.php} (55%) create mode 100644 src/database/seeders/RoleSeeder.php create mode 100644 src/database/seeders/UserSeeder.php diff --git a/Makefile b/Makefile index 7825cef..c9d9b82 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ up: docker-up down: docker-down +reload: docker-down docker-up init: docker-down-clear docker-pull docker-build docker-up app-init app-db-seed docker-up: @@ -19,8 +20,6 @@ docker-build: app-init: docker compose run --rm php composer install - docker compose run --rm php chown root:www-data -R storage/ - docker compose run --rm php chmod 777 -R storage/ docker compose run --rm php cp .env.example .env docker compose run --rm php php artisan key:generate diff --git a/src/app/Http/Controllers/DashboardController.php b/src/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..746087e --- /dev/null +++ b/src/app/Http/Controllers/DashboardController.php @@ -0,0 +1,10 @@ +hasMany(User::class); + } +} diff --git a/src/app/Models/User.php b/src/app/Models/User.php index 16416d5..12b4bff 100644 --- a/src/app/Models/User.php +++ b/src/app/Models/User.php @@ -5,7 +5,10 @@ declare(strict_types=1); namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; + +use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; @@ -14,6 +17,7 @@ class User extends Authenticatable /** @use HasFactory<\Database\Factories\UserFactory> */ use HasFactory; use Notifiable; + use HasUuids; /** * The attributes that are mass assignable. @@ -24,6 +28,7 @@ class User extends Authenticatable 'name', 'email', 'password', + 'role_uuid', ]; /** @@ -48,4 +53,16 @@ class User extends Authenticatable 'password' => 'hashed', ]; } + + /** + * The primary key for the model. + * + * @var string + */ + protected $primaryKey = 'uuid'; + + public function role(): BelongsTo + { + return $this->belongsTo(Role::class, 'role_uuid', 'uuid'); + } } diff --git a/src/database/factories/RoleFactory.php b/src/database/factories/RoleFactory.php new file mode 100644 index 0000000..b825646 --- /dev/null +++ b/src/database/factories/RoleFactory.php @@ -0,0 +1,23 @@ + + */ +class RoleFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/src/database/migrations/2026_02_04_051435_create_roles_table.php b/src/database/migrations/2026_02_04_051435_create_roles_table.php new file mode 100644 index 0000000..21c7030 --- /dev/null +++ b/src/database/migrations/2026_02_04_051435_create_roles_table.php @@ -0,0 +1,30 @@ +uuid()->primary(); + $table->string('name')->unique(); + $table->string('code')->unique(); + $table->string('description'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('roles'); + } +}; diff --git a/src/database/migrations/0001_01_01_000000_create_users_table.php b/src/database/migrations/2026_02_04_051523_create_users_table.php similarity index 55% rename from src/database/migrations/0001_01_01_000000_create_users_table.php rename to src/database/migrations/2026_02_04_051523_create_users_table.php index 05fb5d9..78d30a3 100644 --- a/src/database/migrations/0001_01_01_000000_create_users_table.php +++ b/src/database/migrations/2026_02_04_051523_create_users_table.php @@ -12,28 +12,19 @@ return new class extends Migration public function up(): void { Schema::create('users', function (Blueprint $table) { - $table->id(); + $table->uuid()->primary(); + $table->uuid('role_uuid'); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); - }); - Schema::create('password_reset_tokens', function (Blueprint $table) { - $table->string('email')->primary(); - $table->string('token'); - $table->timestamp('created_at')->nullable(); - }); - - Schema::create('sessions', function (Blueprint $table) { - $table->string('id')->primary(); - $table->foreignId('user_id')->nullable()->index(); - $table->string('ip_address', 45)->nullable(); - $table->text('user_agent')->nullable(); - $table->longText('payload'); - $table->integer('last_activity')->index(); + $table->foreign('role_uuid') + ->references('uuid') + ->on('roles') + ->onDelete('restrict'); }); } diff --git a/src/database/seeders/DatabaseSeeder.php b/src/database/seeders/DatabaseSeeder.php index 6b901f8..5d2382f 100644 --- a/src/database/seeders/DatabaseSeeder.php +++ b/src/database/seeders/DatabaseSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\Role; use App\Models\User; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -15,11 +16,9 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - // User::factory(10)->create(); - - User::factory()->create([ - 'name' => 'Test User', - 'email' => 'test@example.com', + $this->call([ + RoleSeeder::class, + UserSeeder::class, ]); } } diff --git a/src/database/seeders/RoleSeeder.php b/src/database/seeders/RoleSeeder.php new file mode 100644 index 0000000..d4b7c57 --- /dev/null +++ b/src/database/seeders/RoleSeeder.php @@ -0,0 +1,35 @@ + [ + 'name' => 'Admin', + 'code' => 'admin', + 'description' => 'Admin role', + ], + 'user' => [ + 'name' => 'User', + 'code' => 'user', + 'description' => 'User role', + ], + ]; + + DB::transaction(static function() use ($roles) { + $codes = collect($roles)->pluck('code'); + Role::whereNotIn('code', $codes)->delete(); + Role::upsert($roles, ['code'], ['name','description']); + }); + } +} diff --git a/src/database/seeders/UserSeeder.php b/src/database/seeders/UserSeeder.php new file mode 100644 index 0000000..267b07d --- /dev/null +++ b/src/database/seeders/UserSeeder.php @@ -0,0 +1,31 @@ +first(); + + if (!$defaultUser) { + User::factory()->create([ + 'name' => 'Admin', + 'role_uuid' => Role::where('code', 'admin')->first()->uuid, + 'email' => 'admin@example.com', + 'password' => bcrypt('qwaszxedc'), + ]); + } + } +}