Files
alrahma_sunday_school/app/Config/Services.php
T
2026-05-16 15:35:56 -04:00

184 lines
6.1 KiB
PHP

<?php
namespace Config;
use CodeIgniter\Config\BaseService;
use App\Services\SemesterScoreService;
use App\Models\SemesterScoreModel;
use App\Models\ConfigurationModel;
use App\Services\Calculators\HomeworkCalculator;
use App\Services\Calculators\QuizCalculator;
use App\Services\Calculators\ProjectCalculator;
use App\Services\Calculators\AttendanceCalculator;
use App\Models\HomeworkModel;
use App\Models\QuizModel;
use App\Models\ProjectModel;
use App\Models\AttendanceRecordModel;
use App\Models\CalendarModel;
use PHPMailer\PHPMailer\PHPMailer;
/**
* Services Configuration file.
*
* Services are simply other classes/libraries that the system uses
* to do its job. This is used by CodeIgniter to allow the core of the
* framework to be swapped out easily without affecting the usage within
* the rest of your application.
*
* This file holds any application-specific services, or service overrides
* that you might need. An example has been included with the general
* method format you should use for your service methods. For more examples,
* see the core Services file at system/Config/Services.php.
*/
class Services extends BaseService
{
/**
* Override CI Email service to enforce a global Reply-To.
*/
public static function email(?array $config = null, bool $getShared = true)
{
if ($getShared) {
return static::getSharedInstance('email', $config);
}
$config = $config ?? config('Email');
$email = new \CodeIgniter\Email\Email($config);
try {
$rtEmail = env('MAIL_DEFAULT_REPLY_TO');
$rtNameRaw = env('MAIL_DEFAULT_REPLY_TO_NAME');
$rtName = 'Al Rahma Sunday School';
if (is_string($rtNameRaw)) {
$rtNameRaw = trim($rtNameRaw);
if ($rtNameRaw !== '' && !preg_match('/^no[- ]?repl(?:y|ay)$/i', $rtNameRaw)) {
$rtName = $rtNameRaw;
}
}
if ($rtEmail) {
$email->setReplyTo($rtEmail, $rtName);
}
} catch (\Throwable $e) {
// Ignore; ensure service is still usable even if headers not yet setable
}
return $email;
}
public static function PHPMailer(bool $getShared = true)
{
if ($getShared) {
return static::getSharedInstance('PHPMailer');
}
$mail = new PHPMailer(true);
// Set up your PHPMailer configuration
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com'; // Your SMTP host
$mail->SMTPAuth = true;
$mail->Username = 'alrahma.sunday.school@gmail.com'; // Your email
$mail->Password = 'psnp emdq dykw ypul'; // Your email password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;
$mail->Timeout = 10; // ⏱ 10-second timeout max
$mail->SMTPKeepAlive = false; // Prevent hanging connections
$mail->SMTPDebug = 0; // Set to 2 temporarily for debugging
$mail->SMTPDebug = 2; // You can set it to 1, 2, or 3 for increasing verbosity
$mail->Debugoutput = 'html'; // You can output it to 'html' or 'error_log'
return $mail;
}
/**
* Build (or fetch a shared) SemesterScoreService instance.
*
* Usage:
* $svc = service('semesterScoreService'); // shared
* $svc = \Config\Services::semesterScoreService(); // shared
* $svc = \Config\Services::semesterScoreService(false); // NEW instance (not shared)
*/
public static function semesterScoreService(bool $getShared = true): SemesterScoreService
{
if ($getShared) {
return static::getSharedInstance('semesterScoreService');
}
// Core models
$scoreModel = new SemesterScoreModel();
$configModel = new ConfigurationModel();
// Calculators (inject their models)
$homeworkCalc = new HomeworkCalculator(new HomeworkModel());
$quizCalc = new QuizCalculator(new QuizModel());
$projectCalc = new ProjectCalculator(new ProjectModel());
$attendanceCalc = new AttendanceCalculator(
new AttendanceRecordModel(),
new ConfigurationModel(),
new CalendarModel()
);
// If you later add Midterm/Final/Participation calculators, plug them in here.
return new SemesterScoreService(
$scoreModel,
$configModel,
$homeworkCalc,
$quizCalc,
$projectCalc,
$attendanceCalc
);
}
public static function roleService($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('roleService');
}
return new \App\Services\RoleService();
}
public static function emailService($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('emailService');
}
// Replace with your real EmailService class + constructor args
return new \App\Services\EmailService();
}
/**
* TimeService shared builder (timezone detection + conversions).
*/
public static function timeService(bool $getShared = true): \App\Services\TimeService
{
if ($getShared) {
return static::getSharedInstance('timeService');
}
return new \App\Services\TimeService();
}
/**
* Shared API client for outbound HTTP to external services.
*/
public static function apiClient(bool $getShared = true): \App\Services\ApiClient
{
if ($getShared) {
return static::getSharedInstance('apiClient');
}
$apiConfig = config('Api');
$options = [
'baseURI' => $apiConfig->baseURL ?: null,
'timeout' => $apiConfig->timeout,
'headers' => $apiConfig->defaultHeaders,
];
// Remove null/empty values that may cause issues
$options = array_filter($options, static function ($v) {
return $v !== null && $v !== '';
});
$http = static::curlrequest($options);
return new \App\Services\ApiClient($http, $apiConfig);
}
}