diff --git a/backend/app/Admin/Controllers/AuthController.php b/backend/app/Admin/Controllers/AuthController.php new file mode 100644 index 00000000..5c794ff5 --- /dev/null +++ b/backend/app/Admin/Controllers/AuthController.php @@ -0,0 +1,60 @@ +create(); + + $request->session()->regenerate(); + + return $this->successResponse(); + } + + public function login(Request $request): JsonResponse + { + $credentials = ['password' => $request->password]; + + if (filter_var($request->login, FILTER_VALIDATE_EMAIL)) { + $credentials['email'] = $request->login; + } else { + $credentials['username'] = $request->login; + } + + if (Auth::attempt($credentials)) + { + $request->session()->regenerate(); + + $user = Auth::user(); + + return $this->successResponse([ + 'id' => $user->id, + 'username' => $user->username, + 'email' => $user->email, + ]); + } + + return $this->errorResponse(__('messages.incorrect_or_username_password')); + } + + public function logout(Request $request): JsonResponse + { + Auth::logout(); + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + return $this->successResponse(); + } +} diff --git a/backend/app/Admin/Controllers/DocumentationController.php b/backend/app/Admin/Controllers/DocumentationController.php new file mode 100644 index 00000000..bfcf82bf --- /dev/null +++ b/backend/app/Admin/Controllers/DocumentationController.php @@ -0,0 +1,46 @@ +with('documentations'), + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: [ + 'user.id', 'user.username' + ] + ); + } + + public function confirm(User $user): JsonResponse + { + $user->update([ + + ]); + + return $this->successResponse(); + } + + public function reject(User $user): JsonResponse + { + $user->update([ + + ]); + + return $this->successResponse(); + } +} diff --git a/backend/app/Models/City.php b/backend/app/Models/City.php new file mode 100644 index 00000000..3f3ec292 --- /dev/null +++ b/backend/app/Models/City.php @@ -0,0 +1,12 @@ + */ + use HasFactory; +} diff --git a/backend/app/Models/Document.php b/backend/app/Models/Document.php new file mode 100644 index 00000000..b2413440 --- /dev/null +++ b/backend/app/Models/Document.php @@ -0,0 +1,12 @@ + */ + use HasFactory; +} diff --git a/backend/app/Models/Province.php b/backend/app/Models/Province.php new file mode 100644 index 00000000..115498c4 --- /dev/null +++ b/backend/app/Models/Province.php @@ -0,0 +1,12 @@ + */ + use HasFactory; +} diff --git a/backend/app/Http/Controllers/AuthController.php b/backend/app/User/Controller/AuthController.php similarity index 91% rename from backend/app/Http/Controllers/AuthController.php rename to backend/app/User/Controller/AuthController.php index 26598504..8fc61c9b 100644 --- a/backend/app/Http/Controllers/AuthController.php +++ b/backend/app/User/Controller/AuthController.php @@ -1,11 +1,12 @@ 'required|unique:users,username', 'email' => 'required|email|unique:users,email', - 'password' => 'required|string|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:6|confirmed:', + 'password' => 'required|string|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:6|confirmed', ]; } } diff --git a/backend/config/auth.php b/backend/config/auth.php index d0c87999..a968e457 100755 --- a/backend/config/auth.php +++ b/backend/config/auth.php @@ -46,6 +46,10 @@ return [ 'driver' => 'passport', 'provider' => 'users', ], + 'expert' => [ + 'driver' => 'session', + 'provider' => 'experts', + ] ], /* @@ -70,6 +74,10 @@ return [ 'driver' => 'eloquent', 'model' => env('AUTH_MODEL', User::class), ], + 'experts' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', Expert::class), + ], // 'users' => [ // 'driver' => 'database', diff --git a/backend/database/factories/CityFactory.php b/backend/database/factories/CityFactory.php new file mode 100644 index 00000000..e658dee8 --- /dev/null +++ b/backend/database/factories/CityFactory.php @@ -0,0 +1,24 @@ + + */ +class CityFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/backend/database/factories/DocumentFactory.php b/backend/database/factories/DocumentFactory.php new file mode 100644 index 00000000..bb26de44 --- /dev/null +++ b/backend/database/factories/DocumentFactory.php @@ -0,0 +1,24 @@ + + */ +class DocumentFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/backend/database/factories/ProvinceFactory.php b/backend/database/factories/ProvinceFactory.php new file mode 100644 index 00000000..3b869034 --- /dev/null +++ b/backend/database/factories/ProvinceFactory.php @@ -0,0 +1,24 @@ + + */ +class ProvinceFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/backend/database/migrations/0001_01_00_000000_create_provinces_table.php b/backend/database/migrations/0001_01_00_000000_create_provinces_table.php new file mode 100644 index 00000000..3a3f6901 --- /dev/null +++ b/backend/database/migrations/0001_01_00_000000_create_provinces_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('provinces'); + } +}; diff --git a/backend/database/migrations/0001_01_00_000001_create_cities_table.php b/backend/database/migrations/0001_01_00_000001_create_cities_table.php new file mode 100644 index 00000000..4cf721fc --- /dev/null +++ b/backend/database/migrations/0001_01_00_000001_create_cities_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('name'); + $table->foreignId('province_id')->constrained('provinces'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cities'); + } +}; 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 87b84e12..faeaec9b 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 @@ -18,15 +18,16 @@ return new class extends Migration $table->string('last_name')->nullable(); $table->string('email')->unique(); $table->string('password'); - $table->tinyInteger('status')->default(0); + $table->tinyInteger('kyc_status')->default(0); $table->string('national_id')->nullable(); $table->string('address')->nullable(); $table->string('postal_code')->nullable(); - $table->string('account_number')->nullable(); + $table->string('tax_id')->nullable(); $table->string('phone_number')->nullable(); - $table->string('province_id')->nullable(); + $table->date('birth_date')->nullable(); + $table->foreignId('province_id')->nullable()->constrained('provinces'); $table->string('province_name')->nullable(); - $table->string('city_id')->nullable(); + $table->foreignId('city_id')->nullable()->constrained('cities'); $table->string('city_name')->nullable(); $table->timestamps(); diff --git a/backend/database/migrations/2026_05_12_053258_create_documents_table.php b/backend/database/migrations/2026_05_12_053258_create_documents_table.php new file mode 100644 index 00000000..8bcc6ba1 --- /dev/null +++ b/backend/database/migrations/2026_05_12_053258_create_documents_table.php @@ -0,0 +1,30 @@ +id(); + $table->morphs('documentable'); + $table->string('title'); + $table->string('url'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('documents'); + } +}; diff --git a/backend/database/seeders/CitySeeder.php b/backend/database/seeders/CitySeeder.php new file mode 100644 index 00000000..670c9643 --- /dev/null +++ b/backend/database/seeders/CitySeeder.php @@ -0,0 +1,17 @@ +