change from session to token

This commit is contained in:
2025-08-12 16:44:14 +03:30
parent cfb58a4c9c
commit 9a0758a754
9 changed files with 253 additions and 262 deletions

View File

@@ -4,9 +4,10 @@ namespace App\Http\Controllers;
use App\Http\Requests\Auth\LoginRequest; use App\Http\Requests\Auth\LoginRequest;
use App\Http\Traits\ApiResponse; use App\Http\Traits\ApiResponse;
use App\Models\User;
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\Hash;
class AuthController extends Controller class AuthController extends Controller
{ {
@@ -14,33 +15,25 @@ class AuthController extends Controller
public function login(LoginRequest $request): JsonResponse public function login(LoginRequest $request): JsonResponse
{ {
if ($this->attemptLogin($request)) $user = User::query()->where('username', '=', $request->username)->first();
if (!Hash::check($request->password, $user->password))
{ {
$request->session()->regenerate(); return $this->errorResponse(__('messages.invalid_credentials'));
$this->updateUserInfo($request);
return $this->successResponse();
} }
return $this->errorResponse(__('messages.invalid_credentials')); $token = $user->createToken("{$request->username}", ['*'], now()->addWeek())->plainTextToken;
}
protected function attemptLogin(Request $request): bool return $this->successResponse([
{ 'message' => __('messages.successful'),
return Auth::guard()->attempt($request->only('username', 'password')); 'token' => $token
}
protected function updateUserInfo(Request $request): void
{
Auth::user()->update([
'last_login' => now(),
]); ]);
} }
public function logout(Request $request): JsonResponse public function logout(): JsonResponse
{ {
Auth::guard()->logout(); auth()->user()->currentAccessToken()->delete();
$request->session()->invalidate();
$request->session()->regenerateToken();
return $this->successResponse(); return $this->successResponse();
} }
} }

View File

@@ -7,16 +7,17 @@ use App\Facades\File\FileFacade;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Spatie\Permission\Traits\HasRoles; use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable class User extends Authenticatable
{ {
use HasFactory, Notifiable, HasRoles; use HasFactory, Notifiable, HasRoles, HasApiTokens;
protected $guarded = []; protected $guarded = [];
protected $hidden = ['password', 'pivot']; protected $hidden = ['password', 'pivot'];
public string $guard_name = 'web'; public string $guard_name = 'api';
public function storeFile($file, $name) public function storeFile($file, $name)
{ {

View File

@@ -10,7 +10,7 @@ return Application::configure(basePath: dirname(__DIR__))
api: __DIR__.'/../routes/api.php', api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php', commands: __DIR__.'/../routes/console.php',
health: '/up', health: '/up',
apiPrefix: 'server/api', apiPrefix: '/server',
) )
->withMiddleware(function (Middleware $middleware) { ->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(except: [ $middleware->validateCsrfTokens(except: [

View File

@@ -14,7 +14,7 @@ return [
*/ */
'defaults' => [ 'defaults' => [
'guard' => env('AUTH_GUARD', 'web'), 'guard' => env('AUTH_GUARD', 'api'),
'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
], ],
@@ -40,6 +40,10 @@ return [
'driver' => 'session', 'driver' => 'session',
'provider' => 'users', 'provider' => 'users',
], ],
'api' => [
'driver' => 'sanctum',
'provider' => 'users',
],
], ],
/* /*

View File

@@ -15,9 +15,9 @@ class DatabaseSeeder extends Seeder
{ {
// User::factory(10)->create(); // User::factory(10)->create();
User::factory()->create([ // User::factory()->create([
'name' => 'Test User', // 'name' => 'Test User',
'email' => 'test@example.com', // 'email' => 'test@example.com',
]); // ]);
} }
} }

View File

@@ -18,7 +18,7 @@ class PermissionSeeder extends Seeder
'id' => 1, 'id' => 1,
'name' => 'manage_users', 'name' => 'manage_users',
'name_fa' => 'مدیریت کاربران', 'name_fa' => 'مدیریت کاربران',
'guard_name' => 'web', 'guard_name' => 'api',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now() 'updated_at' => now()
], ],
@@ -26,7 +26,7 @@ class PermissionSeeder extends Seeder
'id' => 2, 'id' => 2,
'name' => 'manage_roles', 'name' => 'manage_roles',
'name_fa' => 'مدیریت نقش ها', 'name_fa' => 'مدیریت نقش ها',
'guard_name' => 'web', 'guard_name' => 'api',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now() 'updated_at' => now()
], ],
@@ -34,7 +34,7 @@ class PermissionSeeder extends Seeder
'id' => 3, 'id' => 3,
'name' => 'manage_calls', 'name' => 'manage_calls',
'name_fa' => 'مدیریت تماس ها', 'name_fa' => 'مدیریت تماس ها',
'guard_name' => 'web', 'guard_name' => 'api',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now() 'updated_at' => now()
] ]

View File

@@ -20,7 +20,7 @@ class RoleSeeder extends Seeder
'id' => 1, 'id' => 1,
'name' => 'super-admin', 'name' => 'super-admin',
'name_fa' => 'ادمین', 'name_fa' => 'ادمین',
'guard_name' => 'web', 'guard_name' => 'api',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now() 'updated_at' => now()
]); ]);

View File

@@ -1,15 +1,234 @@
<?php <?php
use App\Http\Controllers\Admin\PermissionManagementController;
use App\Http\Controllers\Admin\RoleManagementController;
use App\Http\Controllers\Admin\UserManagementController;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\CallController; use App\Http\Controllers\CallController;
use App\Http\Controllers\CategoryController;
use App\Http\Controllers\HeadquartersDashboard\CumulativeCentersStatsController;
use App\Http\Controllers\HeadquartersDashboard\CumulativeKeypressStatsController;
use App\Http\Controllers\HeadquartersDashboard\CumulativeMessageRatingStatsController;
use App\Http\Controllers\HeadquartersDashboard\CumulativeVoiceRatingStatsController;
use App\Http\Controllers\HeadquartersDashboard\LoginToProvinceController;
use App\Http\Controllers\ProfileController; use App\Http\Controllers\ProfileController;
use App\Http\Controllers\ProvinceController;
use App\Http\Controllers\ProvinceDashboard\ReportController;
use App\Http\Controllers\ProvinceDashboard\VerifyAuthenticationController;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::prefix('calls')->post('/', [CallController::class, 'store'])->name('store');
Route::prefix('operator') Route::prefix('auth')
->name('auth.')
->controller(AuthController::class)
->group(function () {
Route::post('/login', 'login')->name('login');
Route::post('/logout', 'logout')->name('logout');
});
Route::prefix('profile')
->name('profile.')
->middleware('auth')
->controller(ProfileController::class) ->controller(ProfileController::class)
->group(function () { ->group(function () {
Route::get('/info', 'info')->name('info');
Route::post('/change_password', 'changePassword')->name('changePassword');
Route::post('/change_avatar', 'changeAvatar')->name('changeAvatar');
Route::get('/permissions', 'permissions')->name('permissions');
Route::get('/online', 'online')->name('online'); Route::get('/online', 'online')->name('online');
Route::get('/offline', 'offline')->name('offline'); Route::get('/offline', 'offline')->name('offline');
}); });
Route::prefix('users')
->name('users.')
->middleware(['auth', 'permission:manage_users'])
->controller(UserManagementController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/{user}', 'show')->middleware([SuperAdminCheck::class])->name('show');
Route::post('/', 'store')->name('store');
Route::post('/{user}', 'update')->middleware([SuperAdminCheck::class])->name('update');
Route::delete('/{user}', 'destroy')->middleware([SuperAdminCheck::class])->name('destroy');
});
Route::prefix('calls')
->name('calls.')
->controller(CallController::class)
->group(function () {
Route::post('/', 'store')->name('store');
Route::get('/list', 'list')->name('list')->middleware(['auth', 'permission:manage_calls']);
Route::post('/{call}', 'update')->name('update')->middleware(['auth', 'permission:manage_calls']);
});
Route::prefix('categories')
->middleware('auth')
->controller(CategoryController::class)
->name('categories.')
->group(function () {
Route::get('/list', 'list')->name('list');
});
Route::middleware('auth')
->prefix('permissions')
->name('permissions.')
->controller(PermissionManagementController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('list', 'list')->name('list');
Route::post('/', 'store')->name('store');
Route::get('/{permission}', 'show')->name('show');
Route::post('/{permission}', 'update')->name('update');
Route::delete('/{permission}', 'destroy')->name('destroy');
});
Route::prefix('provinces')
->controller(ProvinceController::class)
->name('provinces.')
->group(function () {
Route::get('/list', 'list')->name('list');
});
Route::middleware('auth')
->prefix('roles')
->name('roles.')
->controller(RoleManagementController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('list', 'list')->name('list');
Route::post('/', 'store')->name('store');
Route::get('/{role}', 'show')->name('show');
Route::post('/{role}', 'update')->name('update');
Route::delete('/{role}', 'destroy')->name('destroy');
});
Route::middleware('auth')
->prefix('cumulative_stats')
->name('cumulativeStats.')
->controller(CumulativeCentersStatsController::class)
->group(function () {
Route::get('/', 'index')->name('index');
});
Route::middleware('auth')
->prefix('cumulative_voice_ratings')
->name('cumulativeVoiceRatings.')
->controller(CumulativeVoiceRatingStatsController::class)
->group(function () {
Route::get('/', 'index')->name('index');
});
Route::middleware('auth')
->prefix('cumulative_keypress_stats')
->name('cumulativeKeypressStats.')
->controller(CumulativeKeypressStatsController::class)
->group(function () {
Route::get('/', 'index')->name('index');
});
Route::middleware('auth')
->prefix('cumulative_message_ratings')
->name('cumulativeMessageRatings.')
->controller(CumulativeMessageRatingStatsController::class)
->group(function () {
Route::get('/', 'index')->name('index');
});
Route::middleware('auth')
->prefix('dialogs')
->name('dialogs.')
->group(function () {
Route::prefix('operator')
->name('operator.')
->controller(\App\Http\Controllers\ProvinceDashboard\OperatorDialogues\OperatorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::get('/{operatorDialogue}','show')->name('show');
});
Route::prefix('supervisor')
->name('supervisor.')
->controller(\App\Http\Controllers\ProvinceDashboard\OperatorDialogues\SupervisorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::post('/rate/{operatorDialogue}', 'rate')->name('rate');
Route::get('/{operatorDialogue}', 'show')->name('show');
});
});
Route::middleware('auth')
->prefix('system_messages')
->name('systemMessages.')
->group(function () {
Route::prefix('operator')
->name('systemMessages.')
->controller(\App\Http\Controllers\ProvinceDashboard\SystemMessages\OperatorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::get('/{systemMessage}', 'show')->name('show');
});
Route::prefix('supervisor')
->name('systemMessages.')
->controller(\App\Http\Controllers\ProvinceDashboard\SystemMessages\SupervisorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::get('/{systemMessage}', 'show')->name('show');
Route::post('/{systemMessage}', 'rate')->name('rate');
});
});
Route::middleware('auth')
->prefix('people_messages')
->name('peopleMessages.')
->group(function () {
Route::prefix('operator')
->name('peopleMessages.')
->controller(\App\Http\Controllers\ProvinceDashboard\PeopleMessages\OperatorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::post('/{peopleMessage}', 'handle')->name('handle');
Route::get('/{peopleMessage}', 'show')->name('show');
});
Route::prefix('supervisor')
->name('peopleMessages.')
->controller(\App\Http\Controllers\ProvinceDashboard\PeopleMessages\SupervisorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::get('/{peopleMessage}', 'show')->name('show');
});
});
Route::middleware(['auth', 'permission:teleport_to_province'])
->prefix('login_to_province')
->name('loginToProvince.')
->controller(LoginToProvinceController::class)
->group(function () {
Route::post('/', 'authenticate')->name('authenticate');
});
Route::middleware(['auth', 'setadIp'])
->prefix('verify_authentication')
->name('verifyAuthentication.')
->controller(VerifyAuthenticationController::class)
->group(function () {
Route::post('/', 'login')->name('login');
});
Route::middleware('auth')
->prefix('report')
->name('report.')
->controller(ReportController::class)
->group(function () {
Route::get('/cumulative', 'cumulative')->name('cumulative');
Route::get('/people_messages', 'peopleMessages')->name('peopleMessages');
Route::get('/detailed_logs', 'detailedLogs')->name('detailedLogs');
Route::get('/operator_performance_daily', 'operatorPerformanceDaily')->name('operatorPerformanceDaily');
Route::get('/operator_performance_total', 'operatorPerformanceTotal')->name('operatorPerformanceTotal');
});

View File

@@ -1,233 +1,7 @@
<?php <?php
use App\Http\Controllers\Admin\PermissionManagementController;
use App\Http\Controllers\Admin\RoleManagementController;
use App\Http\Controllers\Admin\UserManagementController;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\CallController;
use App\Http\Controllers\CategoryController;
use App\Http\Controllers\HeadquartersDashboard\LoginToProvinceController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\ProvinceController;
use App\Http\Controllers\HeadquartersDashboard\CumulativeCentersStatsController;
use App\Http\Controllers\HeadquartersDashboard\CumulativeKeypressStatsController;
use App\Http\Controllers\HeadquartersDashboard\CumulativeMessageRatingStatsController;
use App\Http\Controllers\HeadquartersDashboard\CumulativeVoiceRatingStatsController;
use App\Http\Controllers\ProvinceDashboard\ReportController;
use App\Http\Controllers\ProvinceDashboard\VerifyAuthenticationController;
use App\Http\Middleware\SuperAdminCheck;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::prefix('server')->group(function () { Route::get('/', function () {
Route::prefix('auth') return view('welcome');
->name('auth.')
->controller(AuthController::class)
->group(function () {
Route::post('/login', 'login')->name('login');
Route::post('/logout', 'logout')->name('logout');
});
Route::prefix('profile')
->name('profile.')
->middleware('auth')
->controller(ProfileController::class)
->group(function () {
Route::get('/info', 'info')->name('info');
Route::post('/change_password', 'changePassword')->name('changePassword');
Route::post('/change_avatar', 'changeAvatar')->name('changeAvatar');
Route::get('/permissions', 'permissions')->name('permissions');
});
Route::prefix('users')
->name('users.')
->middleware(['auth', 'permission:manage_users'])
->controller(UserManagementController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/{user}', 'show')->middleware([SuperAdminCheck::class])->name('show');
Route::post('/', 'store')->name('store');
Route::post('/{user}', 'update')->middleware([SuperAdminCheck::class])->name('update');
Route::delete('/{user}', 'destroy')->middleware([SuperAdminCheck::class])->name('destroy');
});
Route::prefix('calls')
->name('calls.')
->controller(CallController::class)
->group(function () {
Route::post('/', 'store')->name('store');
Route::get('/list', 'list')->name('list')->middleware(['auth', 'permission:manage_calls']);
Route::post('/{call}', 'update')->name('update')->middleware(['auth', 'permission:manage_calls']);
});
Route::prefix('categories')
->middleware('auth')
->controller(CategoryController::class)
->name('categories.')
->group(function () {
Route::get('/list', 'list')->name('list');
});
Route::middleware('auth')
->prefix('permissions')
->name('permissions.')
->controller(PermissionManagementController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('list', 'list')->name('list');
Route::post('/', 'store')->name('store');
Route::get('/{permission}', 'show')->name('show');
Route::post('/{permission}', 'update')->name('update');
Route::delete('/{permission}', 'destroy')->name('destroy');
});
Route::prefix('provinces')
->controller(ProvinceController::class)
->name('provinces.')
->group(function () {
Route::get('/list', 'list')->name('list');
});
Route::middleware('auth')
->prefix('roles')
->name('roles.')
->controller(RoleManagementController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('list', 'list')->name('list');
Route::post('/', 'store')->name('store');
Route::get('/{role}', 'show')->name('show');
Route::post('/{role}', 'update')->name('update');
Route::delete('/{role}', 'destroy')->name('destroy');
});
Route::middleware('auth')
->prefix('cumulative_stats')
->name('cumulativeStats.')
->controller(CumulativeCentersStatsController::class)
->group(function () {
Route::get('/', 'index')->name('index');
});
Route::middleware('auth')
->prefix('cumulative_voice_ratings')
->name('cumulativeVoiceRatings.')
->controller(CumulativeVoiceRatingStatsController::class)
->group(function () {
Route::get('/', 'index')->name('index');
});
Route::middleware('auth')
->prefix('cumulative_keypress_stats')
->name('cumulativeKeypressStats.')
->controller(CumulativeKeypressStatsController::class)
->group(function () {
Route::get('/', 'index')->name('index');
});
Route::middleware('auth')
->prefix('cumulative_message_ratings')
->name('cumulativeMessageRatings.')
->controller(CumulativeMessageRatingStatsController::class)
->group(function () {
Route::get('/', 'index')->name('index');
});
Route::middleware('auth')
->prefix('dialogs')
->name('dialogs.')
->group(function () {
Route::prefix('operator')
->name('operator.')
->controller(\App\Http\Controllers\ProvinceDashboard\OperatorDialogues\OperatorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::get('/{operatorDialogue}','show')->name('show');
});
Route::prefix('supervisor')
->name('supervisor.')
->controller(\App\Http\Controllers\ProvinceDashboard\OperatorDialogues\SupervisorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::post('/rate/{operatorDialogue}', 'rate')->name('rate');
Route::get('/{operatorDialogue}', 'show')->name('show');
});
});
Route::middleware('auth')
->prefix('system_messages')
->name('systemMessages.')
->group(function () {
Route::prefix('operator')
->name('systemMessages.')
->controller(\App\Http\Controllers\ProvinceDashboard\SystemMessages\OperatorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::get('/{systemMessage}', 'show')->name('show');
});
Route::prefix('supervisor')
->name('systemMessages.')
->controller(\App\Http\Controllers\ProvinceDashboard\SystemMessages\SupervisorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::get('/{systemMessage}', 'show')->name('show');
Route::post('/{systemMessage}', 'rate')->name('rate');
});
});
Route::middleware('auth')
->prefix('people_messages')
->name('peopleMessages.')
->group(function () {
Route::prefix('operator')
->name('peopleMessages.')
->controller(\App\Http\Controllers\ProvinceDashboard\PeopleMessages\OperatorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::post('/{peopleMessage}', 'handle')->name('handle');
Route::get('/{peopleMessage}', 'show')->name('show');
});
Route::prefix('supervisor')
->name('peopleMessages.')
->controller(\App\Http\Controllers\ProvinceDashboard\PeopleMessages\SupervisorController::class)
->group(function () {
Route::get('/', 'index')->name('index');
Route::get('/excel', 'excel')->name('excel');
Route::get('/{peopleMessage}', 'show')->name('show');
});
});
Route::middleware(['auth', 'permission:teleport_to_province'])
->prefix('login_to_province')
->name('loginToProvince.')
->controller(LoginToProvinceController::class)
->group(function () {
Route::post('/', 'authenticate')->name('authenticate');
});
Route::middleware(['auth', 'setadIp'])
->prefix('verify_authentication')
->name('verifyAuthentication.')
->controller(VerifyAuthenticationController::class)
->group(function () {
Route::post('/', 'login')->name('login');
});
Route::middleware('auth')
->prefix('report')
->name('report.')
->controller(ReportController::class)
->group(function () {
Route::get('/cumulative', 'cumulative')->name('cumulative');
Route::get('/people_messages', 'peopleMessages')->name('peopleMessages');
Route::get('/detailed_logs', 'detailedLogs')->name('detailedLogs');
Route::get('/operator_performance_daily', 'operatorPerformanceDaily')->name('operatorPerformanceDaily');
Route::get('/operator_performance_total', 'operatorPerformanceTotal')->name('operatorPerformanceTotal');
});
}); });