diff --git a/.gitignore b/.gitignore index 3bf780b6..c31b3a14 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea -.env \ No newline at end of file +.env +front \ No newline at end of file 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 989ac3a2..ef9670d0 100755 --- a/backend/app/Models/User.php +++ b/backend/app/Models/User.php @@ -7,6 +7,7 @@ use Database\Factories\UserFactory; 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; @@ -18,4 +19,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/app/User/Controller/AuthController.php b/backend/app/User/Controllers/AuthController.php similarity index 98% rename from backend/app/User/Controller/AuthController.php rename to backend/app/User/Controllers/AuthController.php index 8fc61c9b..a967436c 100644 --- a/backend/app/User/Controller/AuthController.php +++ b/backend/app/User/Controllers/AuthController.php @@ -1,6 +1,6 @@ prefix('expert') + ->name('expert.') + ->group(base_path('routes/expert.php')); + }, ) ->withMiddleware(function (Middleware $middleware): void { $middleware->web()->preventRequestForgery(['*']); 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 @@ +name('documents.') + ->controller(DocumentationController::class) + ->group(function () { + Route::post('/', 'index')->name('index'); + Route::post('confirm', 'confirm')->name('confirm'); + Route::post('reject', 'reject')->name('reject'); + }); diff --git a/backend/routes/web.php b/backend/routes/web.php index 2b0501ed..fc6836d2 100755 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -1,7 +1,7 @@