Compare commits

...

21 Commits

Author SHA1 Message Date
d04637b1ef fix code 2026-05-18 14:10:45 +03:30
3c61e279ec create profile for expert 2026-05-18 13:59:05 +03:30
e9f6ee71fa create profile for expert 2026-05-18 13:58:20 +03:30
60129f5abb create profile for expert 2026-05-18 13:57:03 +03:30
2d8f2dbcc5 create profile for expert 2026-05-18 13:50:37 +03:30
86e353749a create profile for expert 2026-05-18 13:49:33 +03:30
f3a9b5e788 Merge pull request 'create payment and gateway resources' (#17) from feature/PaymentModel into develop
Reviewed-on: #17
2026-05-17 10:31:08 +00:00
d04277ece5 add gaurded values 2026-05-17 14:00:33 +03:30
e53a89016f create payment and gateway resources 2026-05-17 13:57:39 +03:30
53f2303253 Merge pull request 'upload files' (#16) from feature/UploadDoc into develop
Reviewed-on: #16
2026-05-17 05:26:22 +00:00
c6dc5256e6 resolve the conflicts 2026-05-17 08:56:02 +03:30
19abb28acf upload files 2026-05-17 08:49:28 +03:30
431acd9279 Merge pull request 'feature/FixManagment' (#14) from feature/FixManagment into develop
Reviewed-on: #14
2026-05-16 11:31:59 +00:00
9fcd8045db fix code3 2026-05-16 14:57:34 +03:30
7c82556d93 fix code2 2026-05-16 14:38:39 +03:30
581e7af1fd fix code 2026-05-16 14:36:09 +03:30
b433d2ff52 Merge pull request 'create expert login resources' (#13) from feature/ExpertLogin into develop
Reviewed-on: #13
2026-05-13 10:16:51 +00:00
6f06218cb2 Merge pull request 'feature/CreateDocumention' (#12) from feature/CreateDocumention into develop
Reviewed-on: #12
Reviewed-by: amirghasempoor <amirghasempoor79@gmail.com>
2026-05-13 10:16:38 +00:00
1a2077a164 create expert login resources 2026-05-13 13:41:12 +03:30
363c7005d0 Merge pull request 'add level to users table' (#11) from feature/docConfirm into develop
Reviewed-on: #11
2026-05-12 11:03:44 +00:00
f29510d76e add level to users table 2026-05-12 14:32:18 +03:30
169 changed files with 861 additions and 185 deletions

0
backend/.dockerignore Normal file → Executable file
View File

0
backend/.editorconfig Normal file → Executable file
View File

0
backend/.env.example Normal file → Executable file
View File

0
backend/.gitattributes vendored Normal file → Executable file
View File

0
backend/.gitignore vendored Normal file → Executable file
View File

0
backend/.npmrc Normal file → Executable file
View File

0
backend/Dockerfile Normal file → Executable file
View File

0
backend/Dockerfile.production Normal file → Executable file
View File

0
backend/README.md Normal file → Executable file
View File

24
backend/app/Admin/Controllers/AuthController.php Normal file → Executable file
View File

@@ -2,26 +2,34 @@
namespace App\Admin\Controllers; namespace App\Admin\Controllers;
use App\Admin\Requests\Auth\LoginRequest;
use App\Admin\Requests\Auth\RegisterRequest;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Expert;
use App\Traits\ApiResponse; use App\Traits\ApiResponse;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller class AuthController extends Controller
{ {
use ApiResponse; use ApiResponse;
public function register(Request $request): JsonResponse public function register(RegisterRequest $request): JsonResponse
{ {
// Expert::query()->create(); Expert::query()->create([
'username' => $request->username,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
$request->session()->regenerate(); $request->session()->regenerate();
return $this->successResponse(); return $this->successResponse();
} }
public function login(Request $request): JsonResponse public function login(LoginRequest $request): JsonResponse
{ {
$credentials = ['password' => $request->password]; $credentials = ['password' => $request->password];
@@ -35,13 +43,7 @@ class AuthController extends Controller
{ {
$request->session()->regenerate(); $request->session()->regenerate();
$user = Auth::user(); return $this->successResponse();
return $this->successResponse([
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
]);
} }
return $this->errorResponse(__('messages.incorrect_or_username_password')); return $this->errorResponse(__('messages.incorrect_or_username_password'));
@@ -49,7 +51,7 @@ class AuthController extends Controller
public function logout(Request $request): JsonResponse public function logout(Request $request): JsonResponse
{ {
Auth::logout(); Auth::guard('expert')->logout();
$request->session()->invalidate(); $request->session()->invalidate();

View File

@@ -2,6 +2,7 @@
namespace App\Admin\Controllers; namespace App\Admin\Controllers;
use App\Admin\Requests\Documentation\RejectRequest;
use App\Facades\DataTable\DataTableFacade; use App\Facades\DataTable\DataTableFacade;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User; use App\Models\User;
@@ -16,31 +17,37 @@ class DocumentationController extends Controller
public function index(Request $request): array public function index(Request $request): array
{ {
return DataTableFacade::run( return DataTableFacade::run(
User::query()->with('documents'), User::query(),
$request, $request,
allowedFilters: ['*'], allowedFilters: ['*'],
allowedSortings: ['*'], allowedSortings: ['*'],
allowedSelects: [ allowedSelects: [
'users.id', 'users.first_name', 'users.last_name', 'users.national_id', 'id', 'first_name', 'last_name', 'national_id',
'users.phone_number', 'users.postal_code', 'users.city_id', 'users.province_id', 'phone_number', 'postal_code', 'city_id', 'province_id',
'users.province_name', 'users.city_name', 'users.address', 'documents.title', 'documents.url' 'province_name', 'city_name', 'address'
] ]
); );
} }
public function files(User $user): JsonResponse
{
return $this->successResponse($user->load('documents'));
}
public function confirm(User $user): JsonResponse public function confirm(User $user): JsonResponse
{ {
$user->update([ $user->update([
'authority_level' => 1
]); ]);
return $this->successResponse(); return $this->successResponse();
} }
public function reject(User $user): JsonResponse public function reject(RejectRequest $request, User $user): JsonResponse
{ {
$user->update([ $user->update([
'kyc_status' => 0,
'kyc_reject_reason' => $request->kyc_reject_reason
]); ]);
return $this->successResponse(); return $this->successResponse();

View File

@@ -67,8 +67,7 @@ class ExpertManagementController extends Controller
*/ */
public function show(Expert $expert): JsonResponse public function show(Expert $expert): JsonResponse
{ {
return $this->successResponse( return $this->successResponse($expert->load(['roles','permissions'])
new ExpertManagementResource($expert)
); );
} }

View File

39
backend/app/Admin/Controllers/ProfileController.php Normal file → Executable file
View File

@@ -2,11 +2,14 @@
namespace App\Admin\Controllers; namespace App\Admin\Controllers;
use App\Admin\Requests\Profile\ChangePasswordRequest;
use App\Admin\Requests\Profile\EditRequest;
use App\Admin\Resources\ExpertResource; use App\Admin\Resources\ExpertResource;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Traits\ApiResponse; use App\Traits\ApiResponse;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class ProfileController extends Controller class ProfileController extends Controller
{ {
@@ -14,6 +17,40 @@ class ProfileController extends Controller
public function info(): JsonResponse public function info(): JsonResponse
{ {
return $this->successResponse(new ExpertResource(Auth::user())); return $this->successResponse(new ExpertResource(Auth::guard('expert')->user()));
}
public function edit(EditRequest $request): JsonResponse
{
$expert = $request->user('expert');
$expert->update([
'username' => $request->username,
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'email' => $expert->email,
'national_id' => $request->national_id,
'phone_number' => $request->phone_number,
'province_id' => $request->province_id,
'city_id' => $request->city_id,
]);
return $this->successResponse();
}
public function changePassword(ChangePasswordRequest $request): JsonResponse
{
$expert = Auth::guard('expert')->user();
if (! Hash::check($request->current_password, $expert->password))
{
return $this->errorResponse(__('messages.incorrect_current_password'));
}
$expert->update([
'password' => Hash::make($request->new_password)
]);
return $this->successResponse();
} }
} }

View File

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Admin\Requests\Auth;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class LoginRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'login' => 'required|string',
'password' => 'required|string',
];
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Admin\Requests\Auth;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class RegisterRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'username' => 'required|unique:experts,username',
'email' => 'required|email|unique:experts,email',
'password' => 'required|string|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:6|confirmed',
];
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Admin\Requests\Documentation;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class RejectRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'kyc_reject_reason' => 'required|string',
];
}
}

View File

View File

View File

View File

@@ -27,7 +27,7 @@ class UpdateRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'name' => ['required', 'string', 'max:255', Rule::unique('permission', 'name')->ignore($this->permission->id)], 'name' => ['required', 'string', 'max:255', Rule::unique('permissions', 'name')->ignore($this->permission->id)],
]; ];
} }
} }

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Admin\Requests\Profile;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class ChangePasswordRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'current_password' => 'required|string|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:8',
'new_password' => 'required|string|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:8',
];
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Admin\Requests\Profile;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Validator;
class EditRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
$user = $this->user();
return [
'username' => 'string|max:255',
'first_name' => 'required|string',
'last_name' => 'required|string',
'national_id' => 'required',
'email' => 'string|email|max:255',
'phone_number' => 'string',
'province_id' => 'string',
'city_id' => 'string',
];
}
}

View File

@@ -24,8 +24,8 @@ class StoreRequest extends FormRequest
{ {
return [ return [
'name' => 'required|string|unique:roles,name', 'name' => 'required|string|unique:roles,name',
'permissions' => 'required|array', 'permissions' => 'array',
'permissions.*.name' => 'required|string|exists:permissions,name', 'permissions.*' => 'integer|exists:permissions,id',
]; ];
} }
} }

View File

@@ -27,9 +27,9 @@ class UpdateRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'name' => ['required', 'string', 'max:255', Rule::unique('roles', 'name')->ignore($this->role->id)], 'name' => ['string', 'max:255', Rule::unique('roles', 'name')->ignore($this->role->id)],
'permissions' => 'required|array', 'permissions' => 'array',
'permissions.*.name' => 'required|string|exists:permissions,name', 'permissions.*' => 'integer|exists:permissions,id',
]; ];
} }
} }

View File

View File

View File

@@ -1,41 +0,0 @@
<?php
namespace App\Admin\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
/**
* @method roles()
* @method getAllPermissions()
*/
class ExpertManagementResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'username' => $this->username,
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'national_id' => $this->national_id,
'email' => $this->email,
'phone_number' => $this->phone_number,
'province_name' => $this->province_name,
'city_name' => $this->city_name,
'roles' => $this->roles()
->pluck('name')
->values(),
'permissions' => $this->getAllPermissions()
->pluck('name')
->values(),
];
}
}

0
backend/app/Admin/Resources/ExpertResource.php Normal file → Executable file
View File

0
backend/app/Facades/DataTable/DataTable.php Normal file → Executable file
View File

0
backend/app/Facades/DataTable/DataTableFacade.php Normal file → Executable file
View File

0
backend/app/Facades/File/File.php Normal file → Executable file
View File

0
backend/app/Facades/File/FileFacade.php Normal file → Executable file
View File

0
backend/app/Http/Controllers/Controller.php Normal file → Executable file
View File

0
backend/app/Mail/LoginNotificationMail.php Normal file → Executable file
View File

0
backend/app/Models/City.php Normal file → Executable file
View File

0
backend/app/Models/Document.php Normal file → Executable file
View File

3
backend/app/Models/Expert.php Normal file → Executable file
View File

@@ -5,6 +5,7 @@ namespace App\Models;
use Database\Factories\ExpertFactory; use Database\Factories\ExpertFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Traits\HasRoles;
/** /**
* @method roles() * @method roles()
@@ -14,6 +15,8 @@ class Expert extends Model
{ {
/** @use HasFactory<ExpertFactory> */ /** @use HasFactory<ExpertFactory> */
use HasFactory; use HasFactory;
use HasRoles;
protected $guarded = ['id']; protected $guarded = ['id'];
protected string $guard_name = 'web';
} }

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Database\Factories\GatewayFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Gateway extends Model
{
/** @use HasFactory<GatewayFactory> */
use HasFactory;
protected $guarded = ['id'];
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Database\Factories\GatewayCategoryFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class GatewayCategory extends Model
{
/** @use HasFactory<GatewayCategoryFactory> */
use HasFactory;
protected $guarded = ['id'];
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Database\Factories\PaymentFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Payment extends Model
{
/** @use HasFactory<PaymentFactory> */
use HasFactory;
protected $guarded = ['id'];
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Database\Factories\PaymentStatusFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PaymentStatus extends Model
{
/** @use HasFactory<PaymentStatusFactory> */
use HasFactory;
protected $guarded = ['id'];
}

0
backend/app/Models/Province.php Normal file → Executable file
View File

View File

@@ -10,6 +10,8 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\Relations\MorphToMany;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;
use Laravel\Passport\Bridge\Client;
use Laravel\Passport\HasApiTokens; use Laravel\Passport\HasApiTokens;
#[Guarded(['id'])] #[Guarded(['id'])]
@@ -24,4 +26,14 @@ class User extends Authenticatable
{ {
return $this->morphToMany(Document::class, 'documentable'); return $this->morphToMany(Document::class, 'documentable');
} }
public function validateForPassportPasswordGrant(string $password): bool
{
return Hash::check($password, $this->password);
}
public function findForPassport(string $username, Client $client): User
{
return $this->where('username', $username)->first();
}
} }

View File

@@ -22,6 +22,8 @@ class AppServiceProvider extends ServiceProvider
public function boot(): void public function boot(): void
{ {
Passport::enablePasswordGrant(); Passport::enablePasswordGrant();
Passport::tokensExpireIn(CarbonInterval::minutes(1));
Passport::refreshTokensExpireIn(CarbonInterval::minutes(5));
Passport::personalAccessTokensExpireIn(CarbonInterval::minutes(1)); Passport::personalAccessTokensExpireIn(CarbonInterval::minutes(1));
} }
} }

0
backend/app/Providers/DataTableServiceProvider.php Normal file → Executable file
View File

0
backend/app/Providers/FileServiceProvider.php Normal file → Executable file
View File

0
backend/app/Services/DataTable/DataTableInput.php Normal file → Executable file
View File

0
backend/app/Services/DataTable/DataTableService.php Normal file → Executable file
View File

0
backend/app/Services/DataTable/Enums/DataType.php Normal file → Executable file
View File

0
backend/app/Services/DataTable/Enums/SearchType.php Normal file → Executable file
View File

View File

View File

View File

0
backend/app/Services/DataTable/Filter/ApplyFilter.php Normal file → Executable file
View File

0
backend/app/Services/DataTable/Filter/Filter.php Normal file → Executable file
View File

View File

View File

0
backend/app/Services/DataTable/Sort/ApplySort.php Normal file → Executable file
View File

0
backend/app/Services/DataTable/Sort/Sort.php Normal file → Executable file
View File

View File

View File

View File

View File

@@ -1,6 +1,6 @@
<?php <?php
namespace App\User\Services\FIB; namespace App\Services\FIB;
use Exception; use Exception;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;

View File

@@ -1,6 +1,6 @@
<?php <?php
namespace App\User\Services\FIB; namespace App\Services\FIB;
use Exception; use Exception;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;

View File

@@ -1,6 +1,6 @@
<?php <?php
namespace App\User\Services\FIB; namespace App\Services\FIB;
use Exception; use Exception;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;

View File

@@ -1,6 +1,6 @@
<?php <?php
namespace App\User\Services\FIB; namespace App\Services\FIB;
use Exception; use Exception;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;

View File

@@ -1,6 +1,6 @@
<?php <?php
namespace App\User\Services\FIB; namespace App\Services\FIB;
use Exception; use Exception;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;

14
backend/app/User/Controllers/AuthController.php Normal file → Executable file
View File

@@ -18,12 +18,14 @@ class AuthController extends Controller
public function register(RegisterRequest $request): JsonResponse public function register(RegisterRequest $request): JsonResponse
{ {
User::query()->create([ $user = User::query()->create([
'username' => $request->username, 'username' => $request->username,
'email' => $request->email, 'email' => $request->email,
'password' => Hash::make($request->password), 'password' => Hash::make($request->password),
]); ]);
Auth::guard('web')->login($user);
$request->session()->regenerate(); $request->session()->regenerate();
return $this->successResponse(); return $this->successResponse();
@@ -43,13 +45,7 @@ class AuthController extends Controller
{ {
$request->session()->regenerate(); $request->session()->regenerate();
$user = Auth::user(); return $this->successResponse();
return $this->successResponse([
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
]);
} }
return $this->errorResponse(__('messages.incorrect_or_username_password')); return $this->errorResponse(__('messages.incorrect_or_username_password'));
@@ -57,7 +53,7 @@ class AuthController extends Controller
public function logout(Request $request): JsonResponse public function logout(Request $request): JsonResponse
{ {
Auth::logout(); Auth::guard('web')->logout();
$request->session()->invalidate(); $request->session()->invalidate();

View File

@@ -1,14 +0,0 @@
<?php
namespace App\User\Controllers\Dashboard;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ConfirmController extends Controller
{
public function index()
{
//
}
}

View File

@@ -1,24 +0,0 @@
<?php
namespace App\User\Controller\Dashboard;
use App\Http\Controllers\Controller;
use App\Traits\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DocumentationController extends Controller
{
use ApiResponse;
public function store(StoreRequest $request): jsonResponse
{
//
}
public function update(UpdateRequest $request): JsonResponse
{
//
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\User\Controllers;
use App\Facades\File\FileFacade;
use App\Http\Controllers\Controller;
use App\Traits\ApiResponse;
use App\User\Requests\Documentation\EditRequest;
use App\User\Requests\Documentation\UploadRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class DocumentationController extends Controller
{
use ApiResponse;
public function upload(UploadRequest $request): jsonResponse
{
$user = Auth::guard('web')->user();
foreach ($request->documents as $document) {
$user->documents()->create([
'title' => $document['title'],
'url' => FileFacade::save($document['file'], "/{$user->id}/documents", $document['title']),
]);
}
return $this->successResponse();
}
public function edit(EditRequest $request): JsonResponse
{
$user = Auth::guard('web')->user();
foreach ($request->documents as $document) {
$user->documents()->sync();
}
return $this->successResponse();
}
}

12
backend/app/User/Controllers/ProfileController.php Normal file → Executable file
View File

@@ -24,17 +24,7 @@ class ProfileController extends Controller
{ {
$user = Auth::user(); $user = Auth::user();
$user->update([ $user->update($request->validated());
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'national_id' => $request->national_id,
'address' => $request->address,
'postal_code' => $request->postal_code,
'phone_number' => $request->phone_number,
'province_id' => $request->province_id,
'city_id' => $request->city_id,
'status' => 1
]);
return $this->successResponse(); return $this->successResponse();
} }

0
backend/app/User/Requests/Auth/LoginRequest.php Normal file → Executable file
View File

0
backend/app/User/Requests/Auth/RegisterRequest.php Normal file → Executable file
View File

View File

@@ -0,0 +1,31 @@
<?php
namespace App\User\Requests\Documentation;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class EditRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'documents' => 'required|array',
'documents.*.file' => 'required|file|mimes:pdf,jpg,jpeg,png|max:2048',
'documents.*.title' => 'required|string',
];
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\User\Requests\Documentation;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class UploadRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'documents' => 'required|array',
'documents.*.file' => 'required|file|mimes:pdf,jpg,jpeg,png|max:2048',
'documents.*.title' => 'required|string',
];
}
}

View File

40
backend/app/User/Requests/Profile/EditRequest.php Normal file → Executable file
View File

@@ -4,6 +4,8 @@ namespace App\User\Requests\Profile;
use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Validator;
class EditRequest extends FormRequest class EditRequest extends FormRequest
{ {
@@ -22,10 +24,18 @@ class EditRequest extends FormRequest
*/ */
public function rules(): array public function rules(): array
{ {
$user = $this->user();
return [ return [
'first_name' => 'required|string', 'first_name' => [
'last_name' => 'required|string', Rule::prohibitedIf($user->kyc_status == 1), 'string',
'national_id' => 'required', ],
'last_name' => [
Rule::prohibitedIf($user->kyc_status == 1), 'string',
],
'national_id' => [
Rule::prohibitedIf($user->kyc_status == 1), 'string',
],
'address' => 'required', 'address' => 'required',
'postal_code' => 'required', 'postal_code' => 'required',
'phone_number' => 'required', 'phone_number' => 'required',
@@ -33,4 +43,28 @@ class EditRequest extends FormRequest
'city_id' => 'required', 'city_id' => 'required',
]; ];
} }
public function after(): array
{
return [
function (Validator $validator) {
$user = $this->user();
if ($user->kyc_status == 1) {
$lockedFields = [
'first_name',
'last_name',
'national_id',
];
foreach ($lockedFields as $field) {
if ($this->filled($field)) {
$validator->errors()->add(
$field,
'you cannot change this field.'
);
}
}
}
},
];
}
} }

0
backend/app/User/Resources/UserResource.php Normal file → Executable file
View File

0
backend/artisan Normal file → Executable file
View File

0
backend/bootstrap/providers.php Normal file → Executable file
View File

0
backend/composer.json Normal file → Executable file
View File

0
backend/composer.lock generated Normal file → Executable file
View File

0
backend/config/app.php Normal file → Executable file
View File

0
backend/config/cache.php Normal file → Executable file
View File

0
backend/config/database.php Normal file → Executable file
View File

0
backend/config/fib.php Normal file → Executable file
View File

0
backend/config/filesystems.php Normal file → Executable file
View File

0
backend/config/logging.php Normal file → Executable file
View File

0
backend/config/mail.php Normal file → Executable file
View File

Some files were not shown because too many files have changed in this diff Show More