feat: Initial commit for Saqel Platform architecture, backend, Docker, and documentation

This commit is contained in:
Hamza-Ayed
2026-08-26 15:45:55 +03:00
commit d53b64500a
177 changed files with 19909 additions and 0 deletions
@@ -0,0 +1,20 @@
<?php
namespace Database\Factories;
use App\Models\Concept;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Concept>
*/
class ConceptFactory extends Factory
{
public function definition(): array
{
return [
'subject_id' => SubjectFactory::new(),
'name' => fake()->unique()->words(2, true),
];
}
}
@@ -0,0 +1,23 @@
<?php
namespace Database\Factories;
use App\Models\Course;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Course>
*/
class CourseFactory extends Factory
{
public function definition(): array
{
return [
'subject_id' => SubjectFactory::new(),
'grade' => 12,
'track' => 'scientific',
'title' => fake()->sentence(3),
'description' => fake()->paragraph(),
];
}
}
@@ -0,0 +1,23 @@
<?php
namespace Database\Factories;
use App\Models\Lesson;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Lesson>
*/
class LessonFactory extends Factory
{
public function definition(): array
{
return [
'course_id' => CourseFactory::new(),
'title' => fake()->sentence(4),
'order_index' => fake()->numberBetween(1, 100),
'video_id' => 'vid_'.fake()->unique()->uuid(),
'duration_seconds' => fake()->numberBetween(300, 3600),
];
}
}
@@ -0,0 +1,22 @@
<?php
namespace Database\Factories;
use App\Models\Question;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Question>
*/
class QuestionFactory extends Factory
{
public function definition(): array
{
return [
'quiz_id' => QuizFactory::new(),
'concept_id' => ConceptFactory::new(),
'body' => fake()->sentence().'؟',
'explanation' => fake()->paragraph(),
];
}
}
@@ -0,0 +1,21 @@
<?php
namespace Database\Factories;
use App\Models\Quiz;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Quiz>
*/
class QuizFactory extends Factory
{
public function definition(): array
{
return [
'lesson_id' => LessonFactory::new(),
'title' => fake()->sentence(2),
'trigger_seconds' => fake()->numberBetween(60, 600),
];
}
}
@@ -0,0 +1,22 @@
<?php
namespace Database\Factories;
use App\Models\Subject;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<Subject>
*/
class SubjectFactory extends Factory
{
public function definition(): array
{
$name = fake()->unique()->randomElement(['mathematics', 'physics', 'chemistry', 'biology', 'arabic']);
return [
'name' => ucfirst($name),
'slug' => $name,
];
}
}
@@ -0,0 +1,58 @@
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
/**
* @extends Factory<User>
*/
class UserFactory extends Factory
{
/**
* The current password being used by the factory.
*/
protected static ?string $password;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => static::$password ??= Hash::make('password'),
'remember_token' => Str::random(10),
'role' => 'student',
'api_token' => Str::random(60),
'grade' => 12,
'track' => 'scientific',
];
}
/**
* Indicate that the model's email address should be unverified.
*/
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
public function guardian(): static
{
return $this->state(fn (array $attributes) => [
'role' => 'guardian',
'grade' => null,
'track' => null,
]);
}
}