<?php 
declare(strict_types=1); 
 
use Airship\Engine\{ 
    AutoPilot, 
    Gears, 
    State 
}; 
 
/** 
 * This loads the Cabin configuration, and selects the active cabin. 
 * 
 * @global State $state 
 */ 
 
$ap = Gears::getName('AutoPilot'); 
 
// Needed for IDE code completion: 
if (IDE_HACKS) { 
    /** @var AutoPilot $ap */ 
    $ap = $state->autoPilot; 
} 
 
/** 
 * Cache the cabin configuration 
 */ 
$cabinDisabled = false; 
if (\file_exists(ROOT . '/tmp/cache/cabin_data.json')) { 
    // Load the cabins from cache 
    $cabinConfig = \Airship\loadJSON(ROOT . '/tmp/cache/cabin_data.json'); 
    foreach ($cabinConfig['cabins'] as $key => $cabin) { 
        if ($ap::isActiveCabinKey($key, !empty($cabin['https']))) { 
            $state->active_cabin = $key; 
            if ($cabin['enabled']) { 
                $cabinDisabled = true; 
            } 
            break; 
        } 
    } 
    $state->cabins = $cabinConfig['cabins']; 
} else { 
    // Load the cabins, rebuild the cache 
    $cabins = \Airship\loadJSON(ROOT . '/config/cabins.json'); 
    $active_cabin = null; 
    foreach ($cabins as $key => $cabin) { 
        try { 
            $cabinName = !empty($cabin['namespace']) 
                ? $cabin['namespace'] 
                : $cabin['name']; 
 
            $cabin['data'] = \Airship\loadJSON( 
                \implode( 
                    '/', 
                    [ 
                        ROOT, 
                        'Cabin', 
                        $cabinName, 
                        'manifest.json' 
                    ] 
                ) 
            ); 
 
            // Link configuration directory: 
            $startLink = \implode( 
                '/', 
                [ 
                    ROOT, 
                    'config', 
                    'Cabin', 
                    $cabinName 
                ] 
            ); 
            if (!\is_link($startLink)) { 
                $endLink = \implode( 
                    '/', 
                    [ 
                        ROOT, 
                        'Cabin', 
                        $cabinName, 
                        'config' 
                    ] 
                ); 
                \symlink($endLink, $startLink); 
            } 
 
            // Link configuration template: 
            $startLink = \implode( 
                '/', 
                [ 
                    ROOT, 
                    'config', 
                    'templates', 
                    'Cabin', 
                    $cabinName 
                ] 
            ); 
            if (!\is_link($startLink)) { 
                $endLink = \implode( 
                    '/', 
                    [ 
                        ROOT, 
                        'Cabin', 
                        $cabinName, 
                        'config', 
                        'templates' 
                    ] 
                ); 
                \symlink($endLink, $startLink); 
            } 
 
            // Expose common template snippets to the template loader: 
            $startLink = \implode( 
                '/', 
                [ 
                    ROOT, 
                    'Cabin', 
                    $cabinName, 
                    'View', 
                    'common' 
                ] 
            ); 
            if (!\is_link($startLink)) { 
                \symlink(ROOT . '/common', $startLink); 
            } 
        } catch (Exception $ex) { 
            $cabin['data'] = null; 
        } 
        if (empty($active_cabin) && $ap::isActiveCabinKey($key)) { 
            if ($cabin['enabled']) { 
                $active_cabin = $key; 
            } else { 
                $cabinDisabled = true; 
            } 
        } 
        $cabins[$key] = $cabin; 
    } 
 
    if ($cabinDisabled) { 
        \http_response_code(404); 
        echo \file_get_contents( 
            __DIR__ . '/error_pages/no-cabin.html' 
        ); 
        exit(1); 
    } 
    if (empty($active_cabin)) { 
        $k = \array_keys($cabins); 
        $active_cabin = \array_pop($k); 
        unset($k); 
    } 
    $state->active_cabin = $active_cabin; 
 
    $state->cabins = $cabins; 
    \Airship\saveJSON( 
        ROOT.'/tmp/cache/cabin_data.json', 
        [ 
            'cabins' => $cabins 
        ] 
    ); 
} 
 
 |