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
145 lines
5.7 KiB
PHP
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.
|
|
}
|
|
}
|
|
}
|