Initial commit

This commit is contained in:
jeremy bayse
2026-03-20 08:25:58 +01:00
commit a55a33ae2a
143 changed files with 19599 additions and 0 deletions

16
app/Models/AdminLog.php Normal file
View File

@@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Attributes\Fillable;
#[Fillable(['user_id', 'action', 'description'])]
class AdminLog extends Model
{
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}

30
app/Models/Answer.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
#[Fillable(['attempt_id', 'question_id', 'option_id', 'text_content'])]
class Answer extends Model
{
use HasFactory;
public function attempt(): BelongsTo
{
return $this->belongsTo(Attempt::class);
}
public function question(): BelongsTo
{
return $this->belongsTo(Question::class);
}
public function option(): BelongsTo
{
return $this->belongsTo(Option::class);
}
}

38
app/Models/Attempt.php Normal file
View File

@@ -0,0 +1,38 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
#[Fillable(['candidate_id', 'quiz_id', 'score', 'max_score', 'started_at', 'finished_at'])]
class Attempt extends Model
{
use HasFactory;
protected $casts = [
'started_at' => 'datetime',
'finished_at' => 'datetime',
'score' => 'float',
'max_score' => 'integer',
];
public function candidate(): BelongsTo
{
return $this->belongsTo(Candidate::class);
}
public function quiz(): BelongsTo
{
return $this->belongsTo(Quiz::class);
}
public function answers(): HasMany
{
return $this->hasMany(Answer::class);
}
}

31
app/Models/Candidate.php Normal file
View File

@@ -0,0 +1,31 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
#[Fillable(['user_id', 'phone', 'linkedin_url', 'status'])]
class Candidate extends Model
{
use HasFactory;
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function documents(): HasMany
{
return $this->hasMany(Document::class);
}
public function attempts(): HasMany
{
return $this->hasMany(Attempt::class);
}
}

20
app/Models/Document.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
#[Fillable(['candidate_id', 'type', 'file_path', 'original_name'])]
class Document extends Model
{
use HasFactory;
public function candidate(): BelongsTo
{
return $this->belongsTo(Candidate::class);
}
}

24
app/Models/Option.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
#[Fillable(['question_id', 'option_text', 'is_correct'])]
class Option extends Model
{
use HasFactory;
protected $casts = [
'is_correct' => 'boolean',
];
public function question(): BelongsTo
{
return $this->belongsTo(Question::class);
}
}

26
app/Models/Question.php Normal file
View File

@@ -0,0 +1,26 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
#[Fillable(['quiz_id', 'title', 'context', 'label', 'points', 'type'])]
class Question extends Model
{
use HasFactory;
public function quiz(): BelongsTo
{
return $this->belongsTo(Quiz::class);
}
public function options(): HasMany
{
return $this->hasMany(Option::class);
}
}

20
app/Models/Quiz.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
#[Fillable(['title', 'description', 'duration_minutes'])]
class Quiz extends Model
{
use HasFactory;
public function questions(): HasMany
{
return $this->hasMany(Question::class);
}
}

47
app/Models/User.php Normal file
View File

@@ -0,0 +1,47 @@
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Database\Factories\UserFactory;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
#[Fillable(['name', 'email', 'password', 'role'])]
#[Hidden(['password', 'remember_token'])]
class User extends Authenticatable
{
/** @use HasFactory<UserFactory> */
use HasFactory, Notifiable;
public function isAdmin(): bool
{
return $this->role === 'admin';
}
public function isCandidate(): bool
{
return $this->role === 'candidate';
}
public function candidate()
{
return $this->hasOne(Candidate::class);
}
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}