This commit is contained in:
Dr Masroor Ehsan 2025-01-03 20:02:19 +06:00
parent 1cb5e59133
commit b54e2e4ba3
9 changed files with 137 additions and 10 deletions

View File

@ -9,6 +9,6 @@ final class AdminStudyLister extends UserStudyListerBase
{
protected function buildQuery(?int $user_id = null): Builder
{
return self::defaultSortQuery(Study::active());
return self::applySortQuery(Study::active());
}
}

View File

@ -6,6 +6,12 @@
interface IUserStudyLister
{
public function setPageSize(int $size): void;
public function setSortColumn(string $column, string $dir): void;
public function setSearchTerm(string $search): void;
public function all(?int $user_id = null): LengthAwarePaginator;
public function pending(?int $user_id = null): LengthAwarePaginator;

View File

@ -11,7 +11,7 @@ protected function buildQuery(?int $user_id = null): Builder
{
$user_id = (int) ($user_id ?? auth()->id());
return self::defaultSortQuery(
return self::applySortQuery(
Study::active()->where('assigned_physician_id', $user_id)
);
}

View File

@ -11,7 +11,7 @@ protected function buildQuery(?int $user_id = null): Builder
{
$user_id = (int) ($user_id ?? auth()->id());
return self::defaultSortQuery(
return self::applySortQuery(
Study::active()->where('referring_provider_id', $user_id)
);
}

View File

@ -18,6 +18,6 @@ protected function buildQuery(?int $user_id = null): Builder
$query = $query->where('institute_id', $institute_id);
}
return self::defaultSortQuery($query);
return self::applySortQuery($query);
}
}

View File

@ -8,13 +8,25 @@
abstract class UserStudyListerBase implements IUserStudyLister
{
private ?int $pageSize = null;
private ?string $sortColumn = null;
private ?string $sortDir = null;
private ?string $searchTerm = null;
protected static function reportCompleteQuery(Builder $query): Builder
{
return $query->where('report_status', '=', ReportStatus::Signed->value);
}
protected static function defaultSortQuery(Builder $query): Builder
protected function applySortQuery(Builder $query): Builder
{
if ($this->sortColumn) {
return $query->orderBy($this->sortColumn, $this->sortDir ?? 'ASC');
}
return $query
->orderByDesc('study_priority')
->orderByDesc('received_at');
@ -30,18 +42,54 @@ abstract protected function buildQuery(?int $user_id = null): Builder;
public function all(?int $user_id = null): LengthAwarePaginator
{
return $this->buildQuery($user_id)
->paginate(user_per_page($user_id));
->paginate($this->getPageSize($user_id));
}
public function pending(?int $user_id = null): LengthAwarePaginator
{
return self::reportPendingQuery(self::buildQuery($user_id))
->paginate(user_per_page($user_id));
->paginate($this->getPageSize($user_id));
}
public function completed(?int $user_id = null): LengthAwarePaginator
{
return self::reportCompleteQuery(self::buildQuery($user_id))
->paginate(user_per_page($user_id));
->paginate($this->getPageSize($user_id));
}
public function setPageSize(int $size): void
{
$this->pageSize = $size;
}
public function setSortColumn(string $column, string $dir): void
{
$this->sortColumn = $column;
$this->sortDir = $dir;
}
public function setSearchTerm(string $search): void
{
$this->searchTerm = $search;
}
public function getPageSize(?int $user_id = null): int
{
return $this->pageSize ?? $this->getPageSize($user_id);
}
public function applySearch(Builder $query): Builder
{
if ($this->searchTerm) {
$search = "%{$this->searchTerm}%";
$query = $query->where(function ($query) use ($search) {
$query->orWhere('patient_name', 'like', $search);
$query->orWhere('patient_id', 'like', $search);
$query->orWhere('study_description', 'like', $search);
$query->orWhere('body_part_examined', 'like', $search);
});
}
return $query;
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Jobs;
use App\Models\CustomPersonalAccessToken;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\DB;
final readonly class UpdatePersonalAccessToken implements ShouldQueue
{
use Queueable;
public function __construct(private readonly CustomPersonalAccessToken $personalAccessToken, private readonly array $newAttributes) {}
public function handle(): void
{
DB::table($this->personalAccessToken->getTable())
->where('id', $this->personalAccessToken->id)
->update($this->newAttributes);
}
}

View File

@ -0,0 +1,53 @@
<?php
namespace App\Models;
use App\Jobs\UpdatePersonalAccessToken;
use Exception;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Laravel\Sanctum\PersonalAccessToken;
class CustomPersonalAccessToken extends PersonalAccessToken
{
public static function findToken($token)
{
$token = Cache::remember("PersonalAccessToken::$token", 600,
function () use ($token) {
return parent::findToken($token) ?? '_null_';
});
if ($token === '_null_') {
return null;
}
return $token;
}
public function getTokenableAttribute()
{
return Cache::remember("PersonalAccessToken::{$this->id}::tokenable", 600,
function () {
return parent::tokenable()->first();
});
}
public static function boot()
{
parent::boot();
// When updating, cancel normal update and manually update
// the table asynchronously every hour.
static::updating(function (self $personalAccessToken) {
try {
Cache::remember('PersonalAccessToken::lastUsgeUpdate', 3600, function () use ($personalAccessToken) {
dispatch(new UpdatePersonalAccessToken($personalAccessToken, $personalAccessToken->getDirty()));
return now();
});
} catch (Exception $e) {
Log::critical($e->getMessage());
}
return false;
});
}
}

View File

@ -97,7 +97,6 @@ class="d-flex justify-content-between align-items-start border-end pb-4 pb-sm-0
<th>Patient ID</th>
<th>Patient Name</th>
<th>Patient Sex</th>
<th>Patient Birth Date</th>
<th>Modality</th>
<th>Study Date</th>
<th>Receive Date</th>
@ -121,7 +120,6 @@ class="d-flex justify-content-between align-items-start border-end pb-4 pb-sm-0
</a>
</td>
<td>{{ $study->sexAge() }}</td>
<td>{{ $study->patient_birthdate }}</td>
<td>{{ $study->study_modality }}</td>
<td>{{ $study->study_date }}</td>
<td>{{ $study->received_at }}</td>