Files
root e0dfc3ec82
API CI/CD / Validate (composer + pint) (push) Successful in 3m15s
API CI/CD / Test (PHPUnit) (push) Failing after 5m4s
API CI/CD / Build frontend assets (push) Successful in 1m3s
API CI/CD / Security audit (push) Failing after 49s
API CI/CD / Deploy to shared hosting (PHP) (push) Has been skipped
Fixed many feature failures around preferences, route coverage, administrator enrollment, assignment section names, attendance tracking controller access, finance PDF generation, and finance notification logging.
2026-07-07 21:26:47 -04:00

145 lines
5.7 KiB
PHP

<?php
namespace App\Providers;
use App\Models\ClassProgressReport;
use App\Models\ClassSection;
use App\Models\IpAttempt;
use App\Models\LateSlipLog;
use App\Models\Message;
use App\Models\NavItem;
use App\Models\Preferences;
use App\Models\Setting;
use App\Models\Staff;
use App\Models\SupportRequest;
use App\Policies\ClassProgressReportPolicy;
use App\Policies\ClassSectionPolicy;
use App\Policies\IpAttemptPolicy;
use App\Policies\LateSlipLogPolicy;
use App\Policies\MessagePolicy;
use App\Policies\NavItemPolicy;
use App\Policies\PreferencesPolicy;
use App\Policies\SettingPolicy;
use App\Policies\StaffPolicy;
use App\Policies\SupportRequestPolicy;
use App\Services\ApplicationUrlService;
use App\Services\Attendance\AttendanceAutoPublishService;
use App\Services\Attendance\AttendancePolicyService;
use App\Services\Attendance\AttendanceRecordSyncService;
use App\Services\Attendance\SemesterRangeService;
use App\Services\Attendance\StudentAttendanceWriterService;
use App\Services\Attendance\TeacherAttendanceSubmissionService;
use App\Services\AttendanceTracking\AttendanceMailerService;
use App\Services\AttendanceTracking\DefaultAttendanceMailerService;
use App\Services\Invoices\InvoiceConfigService;
use App\Services\Invoices\InvoiceGradeService;
use App\Services\Invoices\InvoiceTuitionService;
use App\Services\Staff\StaffTimeOffLinkService;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton(ApplicationUrlService::class);
$this->app->singleton(AttendancePolicyService::class);
$this->app->singleton(SemesterRangeService::class);
$this->app->singleton(AttendanceRecordSyncService::class);
$this->app->singleton(StudentAttendanceWriterService::class);
$this->app->singleton(TeacherAttendanceSubmissionService::class);
$this->app->singleton(AttendanceAutoPublishService::class);
$this->app->bind(AttendanceMailerService::class, DefaultAttendanceMailerService::class);
$this->app->singleton(StaffTimeOffLinkService::class);
$this->app->singleton(InvoiceConfigService::class);
$this->app->bind(InvoiceGradeService::class, function ($app) {
$config = $app->make(InvoiceConfigService::class);
return new InvoiceGradeService($config->getGradeFee());
});
$this->app->bind(InvoiceTuitionService::class, function ($app) {
$config = $app->make(InvoiceConfigService::class);
return new InvoiceTuitionService(
$app->make(InvoiceGradeService::class),
$config->getGradeFee(),
$config->getFirstStudentFee(),
$config->getSecondStudentFee(),
$config->getYouthFee(),
$config->getTimezone()
);
});
}
public function boot(): void
{
$this->registerSqliteRegexpFunction();
Gate::policy(NavItem::class, NavItemPolicy::class);
Gate::policy(ClassSection::class, ClassSectionPolicy::class);
Gate::policy(IpAttempt::class, IpAttemptPolicy::class);
Gate::policy(LateSlipLog::class, LateSlipLogPolicy::class);
Gate::policy(Message::class, MessagePolicy::class);
Gate::policy(Preferences::class, PreferencesPolicy::class);
Gate::policy(Staff::class, StaffPolicy::class);
Gate::policy(SupportRequest::class, SupportRequestPolicy::class);
Gate::policy(Setting::class, SettingPolicy::class);
Gate::policy(ClassProgressReport::class, ClassProgressReportPolicy::class);
// Re-register the sanctum guard driver to ensure it is available even
// when a stale cached config lacks the sanctum auth guard entry.
Auth::resolved(function ($auth): void {
$auth->extend('sanctum', function ($app, $name, array $config) use ($auth) {
return tap(
new \Illuminate\Auth\RequestGuard(
new \Laravel\Sanctum\Guard(
$auth,
config('sanctum.expiration'),
$config['provider'] ?? null,
config('sanctum.last_used_at', true),
),
request(),
$auth->createUserProvider($config['provider'] ?? null),
),
fn ($guard) => app()->refresh('request', $guard, 'setRequest'),
);
});
});
$this->app->resolving(FormRequest::class, function (FormRequest $request, $app): void {
$request->setContainer($app)->setRedirector($app->make(Redirector::class));
});
}
private function registerSqliteRegexpFunction(): void
{
try {
$connection = DB::connection();
if ($connection->getDriverName() !== 'sqlite') {
return;
}
$pdo = $connection->getPdo();
if (! method_exists($pdo, 'sqliteCreateFunction')) {
return;
}
$pdo->sqliteCreateFunction('REGEXP', static function ($pattern, $value): int {
if ($pattern === null || $value === null) {
return 0;
}
return preg_match('/'.str_replace('/', '\\/', (string) $pattern).'/', (string) $value) === 1 ? 1 : 0;
}, 2);
} catch (\Throwable) {
// Some unit tests boot without a configured database; SQLite compatibility is best-effort there.
}
}
}