Модели роли и пользователей, миграции и сиды

This commit is contained in:
Toy Rik 2026-02-04 13:28:03 +03:00
parent 448d7344b5
commit 50785e6ad5
13 changed files with 233 additions and 22 deletions

View File

@ -1,5 +1,6 @@
up: docker-up up: docker-up
down: docker-down down: docker-down
reload: docker-down docker-up
init: docker-down-clear docker-pull docker-build docker-up app-init app-db-seed init: docker-down-clear docker-pull docker-build docker-up app-init app-db-seed
docker-up: docker-up:
@ -19,8 +20,6 @@ docker-build:
app-init: app-init:
docker compose run --rm php composer install 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 cp .env.example .env
docker compose run --rm php php artisan key:generate docker compose run --rm php php artisan key:generate

View File

@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
//
}

View File

@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class RoleController extends Controller
{
//
}

View File

@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
//
}

View File

@ -0,0 +1,29 @@
<?php
declare(strict_types=1);
namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class BaseModel extends Model
{
use HasUuids;
use HasFactory;
protected static function boot() {
parent::boot();
}
public function getKeyName(): string
{
return 'uuid';
}
public function getKeyType()
{
return 'string';
}
}

27
src/app/Models/Role.php Normal file
View File

@ -0,0 +1,27 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
/**
* @property string $uuid
* @property string $name
* @property string $description
* @property Carbon $created_at
* @property Carbon $updated_at
*/
class Role extends BaseModel
{
protected $fillable = [
'name',
'code',
'description',
];
public function users()
{
return $this->hasMany(User::class);
}
}

View File

@ -5,7 +5,10 @@ declare(strict_types=1);
namespace App\Models; namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail; // use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
@ -14,6 +17,7 @@ class User extends Authenticatable
/** @use HasFactory<\Database\Factories\UserFactory> */ /** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory; use HasFactory;
use Notifiable; use Notifiable;
use HasUuids;
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
@ -24,6 +28,7 @@ class User extends Authenticatable
'name', 'name',
'email', 'email',
'password', 'password',
'role_uuid',
]; ];
/** /**
@ -48,4 +53,16 @@ class User extends Authenticatable
'password' => 'hashed', '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');
}
} }

View File

@ -0,0 +1,23 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Role>
*/
class RoleFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
//
];
}
}

View File

@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('roles', function (Blueprint $table) {
$table->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');
}
};

View File

@ -12,28 +12,19 @@ return new class extends Migration
public function up(): void public function up(): void
{ {
Schema::create('users', function (Blueprint $table) { Schema::create('users', function (Blueprint $table) {
$table->id(); $table->uuid()->primary();
$table->uuid('role_uuid');
$table->string('name'); $table->string('name');
$table->string('email')->unique(); $table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable(); $table->timestamp('email_verified_at')->nullable();
$table->string('password'); $table->string('password');
$table->rememberToken(); $table->rememberToken();
$table->timestamps(); $table->timestamps();
});
Schema::create('password_reset_tokens', function (Blueprint $table) { $table->foreign('role_uuid')
$table->string('email')->primary(); ->references('uuid')
$table->string('token'); ->on('roles')
$table->timestamp('created_at')->nullable(); ->onDelete('restrict');
});
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();
}); });
} }

View File

@ -2,6 +2,7 @@
namespace Database\Seeders; namespace Database\Seeders;
use App\Models\Role;
use App\Models\User; use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
@ -15,11 +16,9 @@ class DatabaseSeeder extends Seeder
*/ */
public function run(): void public function run(): void
{ {
// User::factory(10)->create(); $this->call([
RoleSeeder::class,
User::factory()->create([ UserSeeder::class,
'name' => 'Test User',
'email' => 'test@example.com',
]); ]);
} }
} }

View File

@ -0,0 +1,35 @@
<?php
namespace Database\Seeders;
use App\Models\Role;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$roles = [
'admin' => [
'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']);
});
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Database\Seeders;
use App\Models\Role;
use App\Models\User;
use Faker\Factory;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$faker = Factory::create();
$defaultUser = User::where('name', 'Admin')->first();
if (!$defaultUser) {
User::factory()->create([
'name' => 'Admin',
'role_uuid' => Role::where('code', 'admin')->first()->uuid,
'email' => 'admin@example.com',
'password' => bcrypt('qwaszxedc'),
]);
}
}
}