From abb92b4e229c92716c4d83b4a2b8739fdd641822 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 12 May 2026 13:04:15 +0330 Subject: [PATCH] create user documents --- .../Controllers/DocumentationController.php | 6 ++- backend/app/Models/City.php | 5 ++- backend/app/Models/Document.php | 20 +++++++++- backend/app/Models/Expert.php | 15 +++++++ backend/app/Models/Province.php | 5 ++- backend/app/Models/User.php | 6 +++ backend/database/factories/ExpertFactory.php | 24 ++++++++++++ .../0001_01_01_000000_create_users_table.php | 1 - ...2026_05_12_074230_create_experts_table.php | 39 +++++++++++++++++++ backend/database/seeders/ExpertSeeder.php | 17 ++++++++ 10 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 backend/app/Models/Expert.php create mode 100644 backend/database/factories/ExpertFactory.php create mode 100644 backend/database/migrations/2026_05_12_074230_create_experts_table.php create mode 100644 backend/database/seeders/ExpertSeeder.php diff --git a/backend/app/Admin/Controllers/DocumentationController.php b/backend/app/Admin/Controllers/DocumentationController.php index bfcf82bf..357c7b21 100644 --- a/backend/app/Admin/Controllers/DocumentationController.php +++ b/backend/app/Admin/Controllers/DocumentationController.php @@ -16,12 +16,14 @@ class DocumentationController extends Controller public function index(Request $request): array { return DataTableFacade::run( - User::query()->with('documentations'), + User::query()->with('documents'), $request, allowedFilters: ['*'], allowedSortings: ['*'], allowedSelects: [ - 'user.id', 'user.username' + 'users.id', 'users.first_name', 'users.last_name', 'users.national_id', + 'users.phone_number', 'users.postal_code', 'users.city_id', 'users.province_id', + 'users.province_name', 'users.city_name', 'users.address', 'documents.title', 'documents.url' ] ); } diff --git a/backend/app/Models/City.php b/backend/app/Models/City.php index 3f3ec292..445e69c9 100644 --- a/backend/app/Models/City.php +++ b/backend/app/Models/City.php @@ -2,11 +2,14 @@ namespace App\Models; +use Database\Factories\CityFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class City extends Model { - /** @use HasFactory<\Database\Factories\CityFactory> */ + /** @use HasFactory */ use HasFactory; + + protected $guarded = ['id']; } diff --git a/backend/app/Models/Document.php b/backend/app/Models/Document.php index b2413440..02d0d2f3 100644 --- a/backend/app/Models/Document.php +++ b/backend/app/Models/Document.php @@ -2,11 +2,29 @@ namespace App\Models; +use Database\Factories\DocumentFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\MorphTo; +use Illuminate\Database\Eloquent\Casts\Attribute; +use Illuminate\Support\Facades\Storage; class Document extends Model { - /** @use HasFactory<\Database\Factories\DocumentFactory> */ + /** @use HasFactory */ use HasFactory; + + protected $guarded = ['id']; + + public function documentable(): MorphTo + { + return $this->morphTo(); + } + + protected function url(): Attribute + { + return Attribute::make( + get: fn($value) => Storage::disk('public')->url($value) + ); + } } diff --git a/backend/app/Models/Expert.php b/backend/app/Models/Expert.php new file mode 100644 index 00000000..214bb797 --- /dev/null +++ b/backend/app/Models/Expert.php @@ -0,0 +1,15 @@ + */ + use HasFactory; + + protected $guarded = ['id']; +} diff --git a/backend/app/Models/Province.php b/backend/app/Models/Province.php index 115498c4..854975a8 100644 --- a/backend/app/Models/Province.php +++ b/backend/app/Models/Province.php @@ -2,11 +2,14 @@ namespace App\Models; +use Database\Factories\ProvinceFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Province extends Model { - /** @use HasFactory<\Database\Factories\ProvinceFactory> */ + /** @use HasFactory */ use HasFactory; + + protected $guarded = ['id']; } diff --git a/backend/app/Models/User.php b/backend/app/Models/User.php index 9f73d3cc..2d179582 100755 --- a/backend/app/Models/User.php +++ b/backend/app/Models/User.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Hidden; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Passport\HasApiTokens; @@ -19,4 +20,9 @@ class User extends Authenticatable /** @use HasFactory */ use HasFactory, Notifiable, HasApiTokens; protected $guarded = ['id']; + + public function documents(): MorphToMany + { + return $this->morphToMany(Document::class, 'documentable'); + } } diff --git a/backend/database/factories/ExpertFactory.php b/backend/database/factories/ExpertFactory.php new file mode 100644 index 00000000..6daae3d7 --- /dev/null +++ b/backend/database/factories/ExpertFactory.php @@ -0,0 +1,24 @@ + + */ +class ExpertFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/backend/database/migrations/0001_01_01_000000_create_users_table.php b/backend/database/migrations/0001_01_01_000000_create_users_table.php index faeaec9b..16d24730 100755 --- a/backend/database/migrations/0001_01_01_000000_create_users_table.php +++ b/backend/database/migrations/0001_01_01_000000_create_users_table.php @@ -29,7 +29,6 @@ return new class extends Migration $table->string('province_name')->nullable(); $table->foreignId('city_id')->nullable()->constrained('cities'); $table->string('city_name')->nullable(); - $table->timestamps(); }); diff --git a/backend/database/migrations/2026_05_12_074230_create_experts_table.php b/backend/database/migrations/2026_05_12_074230_create_experts_table.php new file mode 100644 index 00000000..63371886 --- /dev/null +++ b/backend/database/migrations/2026_05_12_074230_create_experts_table.php @@ -0,0 +1,39 @@ +id(); + $table->string('username'); + $table->string('first_name')->nullable(); + $table->string('last_name')->nullable(); + $table->string('email')->unique(); + $table->string('password'); + $table->string('national_id')->nullable(); + $table->string('phone_number')->nullable(); + $table->foreignId('province_id')->nullable()->constrained('provinces'); + $table->string('province_name')->nullable(); + $table->foreignId('city_id')->nullable()->constrained('cities'); + $table->string('city_name')->nullable(); + $table->tinyInteger('level')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('experts'); + } +}; diff --git a/backend/database/seeders/ExpertSeeder.php b/backend/database/seeders/ExpertSeeder.php new file mode 100644 index 00000000..99da2770 --- /dev/null +++ b/backend/database/seeders/ExpertSeeder.php @@ -0,0 +1,17 @@ +