<?php
declare(strict_types=1);
$started=microtime(true);$path=parse_url($_SERVER['REQUEST_URI']??'',PHP_URL_PATH);$method=$_SERVER['REQUEST_METHOD']??'';
if($path!=='/__poc_boundary'&&!preg_match('#^/(store|terminal)/page/(list|defaultData|detail|add|edit|delete|setHome)$#iD',(string)$path)){http_response_code(403);echo '{"denied":true}';return;}
$root=getenv('PAGE_ROOT');$runtime=getenv('PAGE_RUNTIME');ini_set('log_errors','1');ini_set('error_log',$runtime.'/private-error.log');$_SERVER['SCRIPT_FILENAME']=$root.'/public/index.php';$_SERVER['SCRIPT_NAME']='/index.php';$_SERVER['PHP_SELF']='/index.php';
define('TP_ENV','poc');define('BUSINESS','aizhct');define('ENTERPRISE_NO','10001');require $root.'/vendor/autoload.php';spl_autoload_register(static function($class)use($root){foreach(['app\\'=>'app/','cores\\'=>'cores/'] as $prefix=>$dir)if(strpos($class,$prefix)===0){$f=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($f))require $f;}},true,true);require __DIR__.'/external_boundary.php';
if($path==='/__poc_boundary'){$hashes=[];$loaded=[];foreach(['app/store/controller/Page.php','app/terminal/controller/Page.php','app/store/model/Page.php','app/terminal/model/Page.php','app/common/model/Page.php','cores/BaseModel.php','app/common/database/DmBuilder.php'] as $f){$class=str_replace('/','\\',substr($f,0,-4));$actual=(new ReflectionClass($class))->getFileName();$loaded[$f]=realpath($actual)===realpath($root.'/'.$f);$hashes[$f]=hash_file('sha256',$actual);}header('Content-Type: application/json');echo json_encode(['private_cache'=>true,'external_forbidden'=>true,'actual_loaded_paths_verified'=>$loaded,'hashes'=>$hashes]);return;}
$scenario=$_SERVER['HTTP_X_PILOT_SCENARIO']??'';if(!preg_match('/^PILOT_PG_[A-Z0-9_]{1,60}$/D',$scenario)){http_response_code(403);echo '{"denied":true}';return;}
$app=new \think\App($root);$app->setEnvName('poc');$app->setRuntimePath($runtime.'/runtime/');$app->initialize();$hosts=['store.page-config.invalid'=>2147001521,'terminal.page-config.invalid'=>2147001522];$app->env->set('store.host',$hosts);$tenant=$hosts[$app->request->host()]??null;if($tenant===null||getStoreId()!==$tenant){http_response_code(403);echo '{"tenant_denied":true}';return;}
$config=$app->config->get('database');foreach($config['connections'] as &$c){$c['trigger_sql']=true;$c['debug']=false;}unset($c);$app->config->set($config,'database');$app->db->setConfig($app->config);$app->config->set(['default'=>'file','stores'=>['file'=>['type'=>'File','path'=>$runtime.'/cache/','prefix'=>'','expire'=>0]]],'cache');$app->instance('cache',new \think\Cache($app));$log=$app->config->get('log');$log['close']=true;foreach($log['channels'] as &$c)$c['close']=true;unset($c);$app->config->set($log,'log');
require __DIR__.'/SqlCoverageRecorder.php';$recorder=new SqlCoverageRecorder($runtime.'/queries.jsonl',$root,$scenario);$app->db->listen(static function($sql,$elapsed=null)use($runtime,$scenario,$recorder,$tenant){if(strpos((string)$sql,'CONNECT:')===0)return;$recorder->observe($sql,$elapsed);if(preg_match('/^\s*(INSERT|UPDATE|DELETE|MERGE|REPLACE|CREATE|DROP|ALTER)/i',(string)$sql,$m)){file_put_contents($runtime.'/private-write-sql.jsonl',json_encode(['scenario'=>$scenario,'tenant'=>$tenant,'sql'=>$sql])."\n",FILE_APPEND|LOCK_EX);chmod($runtime.'/private-write-sql.jsonl',0600);}});register_shutdown_function([$recorder,'finish']);
$http=$app->http;$response=$http->run();$capture=['scenario'=>$scenario,'method'=>$method,'path'=>$path,'http_status'=>$response->getCode(),'raw'=>$response->getContent(),'elapsed_ms'=>(microtime(true)-$started)*1000];file_put_contents($runtime.'/private-wire.jsonl',json_encode($capture,JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION)."\n",FILE_APPEND|LOCK_EX);chmod($runtime.'/private-wire.jsonl',0600);$response->send();$http->end($response);
