This commit is contained in:
Masroor Ehsan 2024-12-29 20:57:08 +06:00
parent 3ba510a0b2
commit 64dfa4ac3d
15 changed files with 133 additions and 59 deletions

View File

@ -0,0 +1,25 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StudyHistoryRequest extends FormRequest
{
public function rules(): array
{
return [
'study_id' => ['required', 'exists:studies'],
'user_id' => ['required', 'exists:users'],
'clinical_history' => ['nullable'],
'surgical_history' => ['nullable'],
'lab_results' => ['nullable'],
'clinical_diagnosis' => ['nullable'],
];
}
public function authorize(): bool
{
return true;
}
}

10
app/Models/BaseModel.php Normal file
View File

@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
abstract class BaseModel extends Model
{
protected $guarded = ['id'];
}

View File

@ -3,9 +3,8 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Institute extends Model
class Institute extends BaseModel
{
use HasFactory;

View File

@ -4,9 +4,9 @@
use App\Models\Enums\ReportStatus;
use App\Models\Enums\StudyLevelStatus;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
class Study extends Model
class Study extends BaseModel
{
protected $casts = [
'is_locked' => 'boolean',
@ -15,5 +15,8 @@ class Study extends Model
'report_status' => ReportStatus::class,
];
protected $guarded = ['id'];
public function history(): HasOne
{
return $this->hasOne(StudyHistory::class);
}
}

View File

@ -2,6 +2,4 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class StudyAttachment extends Model {}
class StudyAttachment extends BaseModel {}

View File

@ -2,6 +2,4 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class StudyDeleteRequest extends Model {}
class StudyDeleteRequest extends BaseModel {}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class StudyHistory extends BaseModel
{
public function study(): BelongsTo
{
return $this->belongsTo(Study::class);
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}

View File

@ -2,10 +2,9 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class StudyReport extends Model
class StudyReport extends BaseModel
{
public function study(): BelongsTo
{

View File

@ -2,6 +2,4 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Template extends Model {}
class Template extends BaseModel {}

View File

@ -2,6 +2,4 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class TemplateCategory extends Model {}
class TemplateCategory extends BaseModel {}

View File

@ -12,6 +12,24 @@
/** @psalm-type Int32BitMask = int<0, 2147483647> */
trait BitmaskFunctionality
{
/** @param Int32BitMask $value */
public static function hasCase(int $value): bool
{
return self::tryFrom($value) !== null;
}
/** @return Int32BitMask */
public static function build(self ...$bits): int
{
return self::set(0, ...$bits);
}
/** @return Int32BitMask */
public static function set(int $value, self ...$bits): int
{
return $value | self::mask(...$bits);
}
/** @return Int32BitMask */
public static function mask(self ...$bits): int
{
@ -22,39 +40,6 @@ public static function mask(self ...$bits): int
return array_reduce($bits, static fn (?int $sum, self $case) => ($sum ?? 0) | $case->value);
}
/** @param Int32BitMask $value */
public static function hasCase(int $value): bool
{
return self::tryFrom($value) !== null;
}
/** @param Int32BitMask $value */
public static function valueToString(int $value): string
{
return '0b'.substr(chunk_split(sprintf('%\'032b', $value), 4, '_'), 0, -1);
}
public function toString(): string
{
return self::valueToString($this->value);
}
/** @return Int32BitMask */
public static function build(self ...$bits): int
{
return self::set(0, ...$bits);
}
/** @param Int32BitMask $value */
/** @return Int32BitMask */
public static function set(int $value, self ...$bits): int
{
return $value | self::mask(...$bits);
}
/** @param Int32BitMask $value */
/** @return Int32BitMask */
public static function clear(int $value, self ...$bits): int
{
@ -70,10 +55,6 @@ public static function toggle(int $value, self ...$bits): int
}
/** @param Int32BitMask $value */
public static function on(int $value, self $bit): bool
{
return ($value & $bit->value) === $bit->value;
}
/** @param Int32BitMask $value */
public static function off(int $value, self $bit): bool
@ -81,6 +62,8 @@ public static function off(int $value, self $bit): bool
return ($value & $bit->value) === 0;
}
/** @param Int32BitMask $value */
/** @param Int32BitMask $value */
public static function any(int $value, self ...$bits): bool
{
@ -123,4 +106,21 @@ public static function parse(int $value): array
{
return array_filter(self::cases(), static fn (self $case) => self::on($value, $case));
}
/** @param Int32BitMask $value */
public static function on(int $value, self $bit): bool
{
return ($value & $bit->value) === $bit->value;
}
public function toString(): string
{
return self::valueToString($this->value);
}
/** @param Int32BitMask $value */
public static function valueToString(int $value): string
{
return '0b'.substr(chunk_split(sprintf('%\'032b', $value), 4, '_'), 0, -1);
}
}

View File

@ -3,6 +3,7 @@
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Database\Factories\UserFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
@ -15,7 +16,7 @@ class User extends Authenticatable
{
use HasApiTokens;
/** @use HasFactory<\Database\Factories\UserFactory> */
/** @use HasFactory<UserFactory> */
use HasFactory;
use HasProfilePhoto;

2
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "3007185579b2e8489eae9546920efd9e",
"content-hash": "f59da96d435c5fdc613f4228c47309af",
"packages": [
{
"name": "bacon/bacon-qr-code",

View File

@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('study_histories', function (Blueprint $table) {
$table->id();
$table->foreignId('study_id')->index()->constrained('studies')->cascadeOnDelete();
$table->foreignId('user_id')->constrained('users');
$table->text('clinical_history')->nullable();
$table->text('surgical_history')->nullable();
$table->text('lab_results')->nullable();
$table->text('clinical_diagnosis')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('study_histories');
}
};

2
package-lock.json generated
View File

@ -1,5 +1,5 @@
{
"name": "radsparc",
"name": "html",
"lockfileVersion": 3,
"requires": true,
"packages": {