Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions app/Http/Controllers/Api/V1/ApplicantController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,20 @@

namespace App\Http\Controllers\Api\V1;

use App\Http\Requests\Student\StoreStudentRequest;
use App\Http\Resources\StudentResource;
use App\Repositories\StudentApplicantRepository;
use Illuminate\Http\Request;

class ApplicantController extends ApiController
{
protected $applicants;

public function __construct(StudentApplicantRepository $applicants)
{
$this->applicants = $applicants;
}

// GET /students/applicants
public function index(Request $request)
{
Expand All @@ -28,9 +38,10 @@ public function takeAction(Request $request, $id)
}

// POST /students/applicants
public function store(Request $request)
public function store(StoreStudentRequest $request)
{
// TODO: create new applicant
return $this->success([], 'Applicant created');
$student = $this->applicants->create($request->validated());

return $this->success(new StudentResource($student), 'Applicant created', 201);
}
}
43 changes: 43 additions & 0 deletions app/Http/Controllers/Api/V1/SchoolController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Http\Requests\StoreSchoolRequest;
use App\Http\Requests\UpdateSchoolRequest;
use App\Http\Resources\SchoolResource;
use App\Models\School;

class SchoolController extends ApiController
{
public function index()
{
return SchoolResource::collection(School::all());
}

public function store(StoreSchoolRequest $request)
{
$school = School::create($request->validated());

return new SchoolResource($school);
}

public function show(School $school)
{
return new SchoolResource($school);
}

public function update(UpdateSchoolRequest $request, School $school)
{
$school->update($request->validated());

return new SchoolResource($school);
}

public function destroy(School $school)
{
$school->delete();

return response()->noContent();
}
}
6 changes: 3 additions & 3 deletions app/Http/Controllers/Api/V1/TeacherController.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ public function index(Request $request)

public function store(StoreTeacherRequest $request)
{
// Implement teacher creation logic
// For now, just return a success response
return $this->success(null, 'Teacher created successfully', 201);
$teacher = $this->teachers->create($request->validated());

return $this->success(new TeacherResource($teacher), 'Teacher created successfully', 201);
}

public function show($id)
Expand Down
26 changes: 26 additions & 0 deletions app/Http/Requests/StoreSchoolRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreSchoolRequest extends FormRequest
{
public function authorize()
{
return true;
}

public function rules()
{
return [
'name' => 'required|string|max:255',
'address' => 'required|string',
'phone' => 'required|string',
'logo' => 'nullable|url',
'country' => 'required|string',
'city' => 'required|string',
'location' => 'required|string',
];
}
}
27 changes: 14 additions & 13 deletions app/Http/Requests/Student/StoreStudentRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,21 @@ public function authorize()
public function rules()
{
return [
'name' => 'required|string|max:255',
'Avater' => 'nullable|string',
'gender' => 'required|in:Male,Female',
'birthDate' => 'required|date',
'email' => 'required|email|unique:users,email',
'phoneZone' => 'required|string',
'phone' => 'required|string',
'whatsappZone' => 'nullable|string',
'whatsappPhone' => 'nullable|string',
'country' => 'required|string',
'residence' => 'required|string',
'city' => 'required|string',
'user.name' => 'required|string|max:255',
'user.email' => 'required|email|unique:users,email',
'user.password' => 'required|string|min:8',
'user.avatar' => 'nullable|string',
'user.gender' => 'required|in:Male,Female',
'user.birth_date' => 'required|date',
'user.phone_zone' => 'required|string',
'user.phone' => 'required|string',
'user.whatsapp_zone' => 'nullable|string',
'user.whatsapp' => 'nullable|string',
'user.country' => 'required|string',
'user.residence' => 'required|string',
'user.city' => 'required|string',
'qualification' => 'required|string',
'memorizationLevel' => 'required|integer|between:0,30',
'memorization_level' => 'required|integer|between:0,30',
'status' => 'in:active,stopped,dropout',
];
}
Expand Down
12 changes: 11 additions & 1 deletion app/Http/Requests/Teacher/StoreTeacherRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,17 @@ public function rules()
'experience_years' => 'nullable|integer|min:0',
'user.name' => 'required|string|max:255',
'user.email' => 'required|email|unique:users,email',
// Add other user fields as needed
'user.password' => 'required|string|min:8',
'user.avatar' => 'nullable|string',
'user.gender' => 'required|in:Male,Female',
'user.birth_date' => 'required|date',
'user.phone_zone' => 'required|string',
'user.phone' => 'required|string',
'user.whatsapp_zone' => 'nullable|string',
'user.whatsapp' => 'nullable|string',
'user.country' => 'required|string',
'user.residence' => 'required|string',
'user.city' => 'required|string',
];
}
}
26 changes: 26 additions & 0 deletions app/Http/Requests/UpdateSchoolRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdateSchoolRequest extends FormRequest
{
public function authorize()
{
return true;
}

public function rules()
{
return [
'name' => 'sometimes|required|string|max:255',
'address' => 'sometimes|required|string',
'phone' => 'sometimes|required|string',
'logo' => 'nullable|url',
'country' => 'sometimes|required|string',
'city' => 'sometimes|required|string',
'location' => 'sometimes|required|string',
];
}
}
28 changes: 28 additions & 0 deletions app/Http/Resources/SchoolResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class SchoolResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'address' => $this->address,
'phone' => $this->phone,
'logo' => $this->logo,
'country' => $this->country,
'city' => $this->city,
'location' => $this->location,
];
}
}
16 changes: 14 additions & 2 deletions app/Repositories/StudentApplicantRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

namespace App\Repositories;

use App\Models\StudentApplicant;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

// Placeholder for StudentApplicant model if it does not exist
if (! class_exists('App\\Models\\StudentApplicant')) {
eval('namespace App\\Models; class StudentApplicant extends \\Illuminate\\Database\\Eloquent\\Model {}');
}

use App\Models\StudentApplicant;

class StudentApplicantRepository
{
public function all($filters = [], $pagination = true)
Expand All @@ -34,5 +36,15 @@ public function find($id)
return StudentApplicant::findOrFail($id);
}

public function create($data)
{
$userData = $data['user'];
$userData['password'] = Hash::make($userData['password']);
$user = User::create($userData);
$student = $user->student()->create($data);

return $student->fresh(['user']);
}

// Add methods for actions (accept, reject, etc.)
}
12 changes: 12 additions & 0 deletions app/Repositories/TeacherRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
namespace App\Repositories;

use App\Models\Teacher;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

class TeacherRepository
{
Expand Down Expand Up @@ -64,5 +66,15 @@ public function assignHalaqas($teacherId, $halaqaIds)
}
}

public function create($data)
{
$userData = $data['user'];
$userData['password'] = Hash::make($userData['password']);
$user = User::create($userData);
$teacher = $user->teacher()->create($data);

return $teacher->fresh(['user', 'halaqahs']);
}

// Add methods for assign, actions, etc. as needed
}
34 changes: 24 additions & 10 deletions database/factories/AdminFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,37 @@

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Admin>
*/
class AdminFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'user_id' => \App\Models\User::factory(),
'super_admin' => fake()->boolean(),
'user_id' => User::factory()->admin(), // Use the admin state from UserFactory
'super_admin' => false,
'status' => 'accepted',
];
}

/**
* Indicate that the admin is a super admin.
*/
public function superAdmin(): static
{
return $this->state(fn (array $attributes) => [
'super_admin' => true,
]);
}

/**
* Indicate that the admin's status is pending.
*/
public function pending(): static
{
return $this->state(fn (array $attributes) => [
'status' => 'pending',
]);
}
}
17 changes: 4 additions & 13 deletions database/factories/ApplicantFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ public function definition(): array
{
$applicationType = $this->faker->randomElement(['teacher', 'student']);

$userFactoryState = $applicationType === 'teacher' ? 'teacher' : 'student';

$bio = $applicationType === 'teacher'
? 'مُعلم لغة عربية بخبرة تمتد لـ '.$this->faker->numberBetween(3, 15).' سنوات في تدريس القرآن الكريم وعلومه. حاصل على إجازة في القراءات العشر.'
: 'طالب علم مجتهد، أسعى لتعميق فهمي للقرآن الكريم وتلاوته. لدي خبرة سابقة في المشاركة في حلقات التحفيظ المحلية.';
Expand All @@ -20,15 +22,9 @@ public function definition(): array
? 'إجازة في علوم القرآن، شهادة في أساليب التدريس الحديثة، خبرة في التعامل مع مختلف الفئات العمرية.'
: 'خاتم لـ '.$this->faker->numberBetween(5, 20).' أجزاء من القرآن الكريم، ومشارك فعال في الأنشطة الدينية بالمسجد المحلي.';

$intentStatement = $applicationType === 'teacher'
? 'أتطلع إلى المساهمة في تنشئة جيل جديد من حفظة القرآن، وتطبيق خبرتي في بيئة تعليمية محفزة وملهمة.'
: 'أهدف إلى إتمام حفظ القرآن الكريم وتلقي العلم على يد معلمين أكفاء للانضمام إلى نخبة حفظة كتاب الله.';

return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'user_id' => User::factory(),
'school_id' => null,
'user_id' => User::factory()->$userFactoryState(),
'school_id' => School::factory(),
'application_type' => $applicationType,
'status' => 'pending',
'bio' => $bio,
Expand Down Expand Up @@ -58,11 +54,6 @@ public function rejected()
{
return $this->state(fn (array $attributes) => [
'status' => 'rejected',
'rejection_reason' => $this->faker->randomElement([
'المعلومات المقدمة غير كافية.',
'عدم استيفاء شروط الخبرة المطلوبة.',
'نعتذر، لقد تم إشغال جميع الشواغر المتاحة حالياً.',
]),
]);
}
}
Loading