File "CheckChild.php"

Full Path: /home/trinadezambia/public_html/admin_panel/app/Http/Middleware/CheckChild.php
File size: 3.02 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Http\Middleware;

use App\Models\School;
use App\Services\CachingService;
use Auth;
use Closure;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
use Laravel\Sanctum\PersonalAccessToken;

class CheckChild
{
    /**
     * Handle an incoming request.
     *
     * @param Request $request
     * @param Closure(Request): (Response|RedirectResponse) $next
     * @return JsonResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $url = $request->getRequestUri();
        // For api routes
        if (strpos($url, 'api') !== false) {
            $schoolCode = $request->header('school-code');
            if ($schoolCode) {
                $school = School::on('mysql')->where('code', $schoolCode)->first();

                if ($school) {
                    DB::setDefaultConnection('school');
                    Config::set('database.connections.school.database', $school->database_name);
                    DB::purge('school');
                    DB::connection('school')->reconnect();
                    DB::setDefaultConnection('school');
                    $token = $request->bearerToken();
                    $user = PersonalAccessToken::findToken($token);

                    if ($user) {
                        Auth::loginUsingId($user->tokenable_id);
                    } else {
                        return response()->json(['message' => 'Unauthenticated.']);
                    }
                } else {
                    return response()->json(['message' => 'Invalid school code'], 400);
                }
            }
        } else {
            // For web routes
            $school_database_name = Session::get('school_database_name');
            if ($school_database_name) {
                DB::setDefaultConnection('school');
                Config::set('database.connections.school.database', $school_database_name);
                DB::purge('school');
                DB::connection('school')->reconnect();
                DB::setDefaultConnection('school');
            } else {
                DB::purge('school');
                DB::connection('mysql')->reconnect();
                DB::setDefaultConnection('mysql');
            }
        }
        // get default session year
        if (DB::getDefaultConnection() == 'school') {
            $defaultSessionYear = app(CachingService::class)->getDefaultSessionYear(Auth::user()->school_id);
            $children = $request->user()->guardianRelationChild()->where('id', $request->child_id)->where('session_year_id', $defaultSessionYear->id)->first();
            if (empty($children)) {
                return response()->json(array(
                    'error'   => true,
                    'message' => "Unauthenticated",
                    'code'    => 401,
                ));
            }
        }


        return $next($request);
    }
}