yttcom.net
Backend
/
Tools
/
File Editor
Backend
/
Tools
/
File Editor
/
api.php
v1.5
api.php
systems/80-kitchen/data/api.php
π¨ Print
π Read
β Edit
β
<?php // CAI canonical time function (Phase 1 07/09/26) if(!function_exists('cai_now')){ function cai_now(){ return (new DateTime('now',new DateTimeZone('America/Los_Angeles')))->format('Y-m-d H:i:s'); } } if(!function_exists('cai_time')){ function cai_time(){ return (new DateTime('now',new DateTimeZone('America/Los_Angeles')))->format('m/d/y g:ia').' PT'; } } function pt_now() { return (new DateTime('now', new DateTimeZone('America/Los_Angeles')))->format('Y-m-d H:i:s'); } date_default_timezone_set("America/Los_Angeles"); header('Content-Type: application/json'); $VALID_TOKEN = 'yttcom-admin-d60283b1a40a3180ea51e7a579e4d9f2f8fc5f07ac81d89e'; $token = $_GET['token'] ?? $_POST['token'] ?? ''; if ($token !== $VALID_TOKEN && $token !== "yttcom-isc-9ab74e131aec869e773a19d25b693f59ef3b7a42") { echo json_encode(['status'=>'error','message'=>'Unauthorized']); exit; } $dir = __DIR__; $db_file = $dir . '/80-sys.db'; try { $db = new PDO('sqlite:' . $db_file); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->exec('PRAGMA journal_mode=WAL'); // Init tables $db->exec("CREATE TABLE IF NOT EXISTS decisions ( id INTEGER PRIMARY KEY AUTOINCREMENT, system TEXT, date TEXT, subject TEXT, detail TEXT, approved_by TEXT, created_at DATETIME DEFAULT (datetime('now','localtime')) )"); $db->exec("CREATE TABLE IF NOT EXISTS sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, system TEXT, date TEXT, summary TEXT, decisions_count INTEGER DEFAULT 0, transfers_in INTEGER DEFAULT 0, transfers_out INTEGER DEFAULT 0, created_at DATETIME DEFAULT (datetime('now','localtime')) )"); $db->exec("CREATE TABLE IF NOT EXISTS events ( id INTEGER PRIMARY KEY AUTOINCREMENT, system TEXT, date TEXT, type TEXT, subject TEXT, detail TEXT, created_at DATETIME DEFAULT (datetime('now','localtime')) )"); $db->exec("CREATE TABLE IF NOT EXISTS transfers_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, system TEXT, direction TEXT, from_system TEXT, to_system TEXT, subject TEXT, transfer_id INTEGER, created_at DATETIME DEFAULT (datetime('now','localtime')) )"); $db->exec("CREATE TABLE IF NOT EXISTS domain ( id INTEGER PRIMARY KEY AUTOINCREMENT, system TEXT, category TEXT, key TEXT, value TEXT, date TEXT, created_at DATETIME DEFAULT (datetime('now','localtime')) )"); $db->exec("CREATE TABLE IF NOT EXISTS items ( id INTEGER PRIMARY KEY AUTOINCREMENT, system TEXT, subject TEXT, detail TEXT, status TEXT DEFAULT 'open', priority TEXT DEFAULT 'normal', created_at DATETIME DEFAULT (datetime('now','localtime')), resolved_at DATETIME )"); } catch (Exception $e) { echo json_encode(['status'=>'error','message'=>$e->getMessage()]); exit; } $action = $_GET['action'] ?? $_POST['action'] ?? 'ping'; $ts = cai_time(); switch ($action) { case 'ping': $counts = []; foreach (['decisions','sessions','events','transfers_log','domain','items'] as $t) { $counts[$t] = $db->query("SELECT COUNT(*) FROM $t")->fetchColumn(); } echo json_encode(['status'=>'ok','db'=>basename($db_file),'tables'=>$counts,'timestamp'=>$ts]); break; case 'add_decision': $system = $_POST['system'] ?? ''; $subject = $_POST['subject'] ?? ''; $detail = $_POST['detail'] ?? ''; $approved_by = $_POST['approved_by'] ?? 'USR369'; $date = (new DateTime('now',new DateTimeZone('America/Los_Angeles')))->format('m/d/y'); $st = $db->prepare("INSERT INTO decisions (system,date,subject,detail,approved_by,tr_id,created_at) VALUES (?,?,?,?,?,?,?)"); $tr_id = $_POST['tr_id'] ?? $_GET['tr_id'] ?? null; $st->execute([$system,$date,$subject,$detail,$approved_by,null,$tr_id,pt_now()]); echo json_encode(['status'=>'ok','id'=>$db->lastInsertId(),'timestamp'=>$ts]); break; case 'add_session': $system = $_POST['system'] ?? ''; $summary = $_POST['summary'] ?? ''; $dec = $_POST['decisions_count'] ?? 0; $tin = $_POST['transfers_in'] ?? 0; $tout = $_POST['transfers_out'] ?? 0; $date = (new DateTime('now',new DateTimeZone('America/Los_Angeles')))->format('m/d/y'); $dur = $_POST['duration_minutes'] ?? $_GET['duration_minutes'] ?? 0; $work = $_POST['work_done'] ?? $_GET['work_done'] ?? ''; $dids = $_POST['decision_ids'] ?? $_GET['decision_ids'] ?? ''; $pkg = $_POST['package'] ?? $_GET['package'] ?? 'Series D'; $now = pt_now(); $st = $db->prepare("INSERT INTO sessions (system,opened_at,closed_at,package,summary,status,duration_minutes,work_done,decision_ids) VALUES (?,?,?,?,?,?,?,?,?)"); $st->execute([$system,$now,$now,$pkg,$summary,'closed',$dur,$work,$dids]); echo json_encode(['status'=>'ok','id'=>$db->lastInsertId(),'timestamp'=>$ts]); break; case 'add_event': $system = $_POST['system'] ?? ''; $type = $_POST['type'] ?? 'note'; $subject = $_POST['subject'] ?? ''; $detail = $_POST['detail'] ?? ''; $date = (new DateTime('now',new DateTimeZone('America/Los_Angeles')))->format('m/d/y'); $st = $db->prepare("INSERT INTO events (system,date,type,subject,detail) VALUES (?,?,?,?,?)"); $st->execute([$system,$date,$type,$subject,$detail]); echo json_encode(['status'=>'ok','id'=>$db->lastInsertId(),'timestamp'=>$ts]); break; case 'log_transfer': $system = $_POST['system'] ?? ''; $direction = $_POST['direction'] ?? ''; $from = $_POST['from_system'] ?? ''; $to = $_POST['to_system'] ?? ''; $subject = $_POST['subject'] ?? ''; $tid = $_POST['transfer_id'] ?? 0; $st = $db->prepare("INSERT INTO transfers_log (system,direction,from_system,to_system,subject,transfer_id) VALUES (?,?,?,?,?,?)"); $st->execute([$system,$direction,$from,$to,$subject,$tid]); echo json_encode(['status'=>'ok','id'=>$db->lastInsertId(),'timestamp'=>$ts]); break; case 'add_domain': $system = $_POST['system'] ?? ''; $category = $_POST['category'] ?? ''; $key = $_POST['key'] ?? ''; $value = $_POST['value'] ?? ''; $date = (new DateTime('now',new DateTimeZone('America/Los_Angeles')))->format('m/d/y'); $st = $db->prepare("INSERT INTO domain (system,category,key,value,date) VALUES (?,?,?,?,?)"); $st->execute([$system,$category,$key,$value,$date]); echo json_encode(['status'=>'ok','id'=>$db->lastInsertId(),'timestamp'=>$ts]); break; case 'update_domain': $id = $_POST['id'] ?? 0; if (!$id) { echo json_encode(['status'=>'error','message'=>'id required']); break; } $allowed = ['category','key','value','date']; $sets = []; $vals = []; foreach ($allowed as $field) { if (isset($_POST[$field])) { $sets[] = "$field=?"; $vals[] = $_POST[$field]; } } if (empty($sets)) { echo json_encode(['status'=>'error','message'=>'nothing to update']); break; } $vals[] = $id; $st = $db->prepare('UPDATE domain SET ' . implode(',', $sets) . ' WHERE id=?'); $st->execute($vals); echo json_encode(['status'=>'ok','id'=>$id,'timestamp'=>$ts]); break; case 'add_item': $system = $_POST['system'] ?? ''; $subject = $_POST['subject'] ?? ''; $detail = $_POST['detail'] ?? ''; $priority = $_POST['priority'] ?? 'normal'; $st = $db->prepare("INSERT INTO items (system,subject,detail,priority) VALUES (?,?,?,?)"); $st->execute([$system,$subject,$detail,$priority]); echo json_encode(['status'=>'ok','id'=>$db->lastInsertId(),'timestamp'=>$ts]); break; case 'resolve_item': $id = $_POST['id'] ?? 0; $db->exec("UPDATE items SET status='resolved', resolved_at=datetime('now') WHERE id=$id"); echo json_encode(['status'=>'ok','timestamp'=>$ts]); break; case 'update_item': $id = $_POST['id'] ?? 0; if (!$id) { echo json_encode(['status'=>'error','message'=>'id required']); break; } $allowed = ['subject','detail','priority','status']; $sets = []; $vals = []; foreach ($allowed as $field) { if (isset($_POST[$field])) { $sets[] = "$field=?"; $vals[] = $_POST[$field]; } } if (empty($sets)) { echo json_encode(['status'=>'error','message'=>'nothing to update']); break; } $vals[] = $id; $st = $db->prepare('UPDATE items SET ' . implode(',', $sets) . ' WHERE id=?'); $st->execute($vals); echo json_encode(['status'=>'ok','id'=>$id,'timestamp'=>$ts]); break; case 'get_decisions': $rows = $db->query("SELECT * FROM decisions ORDER BY id DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['status'=>'ok','count'=>count($rows),'rows'=>$rows,'timestamp'=>$ts]); break; case 'get_items': $status = $_GET['status'] ?? 'open'; $rows = $db->query("SELECT * FROM items WHERE status='$status' ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['status'=>'ok','count'=>count($rows),'rows'=>$rows,'timestamp'=>$ts]); break; case 'get_domain': $cat = $_GET['category'] ?? ''; $where = $cat ? "WHERE category='$cat'" : ''; $rows = $db->query("SELECT * FROM domain $where ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['status'=>'ok','count'=>count($rows),'rows'=>$rows,'timestamp'=>$ts]); break; case 'summary': $out = []; foreach (['decisions','sessions','events','transfers_log','domain','items'] as $t) { $out[$t] = $db->query("SELECT COUNT(*) FROM $t")->fetchColumn(); } $open_items = $db->query("SELECT COUNT(*) FROM items WHERE status='open'")->fetchColumn(); echo json_encode(['status'=>'ok','db'=>basename($db_file),'counts'=>$out,'open_items'=>$open_items,'timestamp'=>$ts]); break; case 'add_recipe': $system = $_POST['system'] ?? '80'; $title = $_POST['title'] ?? ''; $category = $_POST['category'] ?? 'personal'; $ingredients = $_POST['ingredients'] ?? ''; $steps = $_POST['steps'] ?? ''; $notes = $_POST['notes'] ?? ''; $source = $_POST['source'] ?? 'USR369'; $now = date('Y-m-d H:i:s'); $status = $_POST['status'] ?? 'draft'; $version = $_POST['version'] ?? 'v1.0'; $user_notes = $_POST['user_notes'] ?? ''; $st = $db->prepare("INSERT INTO recipes (system,title,category,ingredients,steps,notes,source,created_at,status,version,last_updated,user_notes) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"); $st->execute([$system,$title,$category,$ingredients,$steps,$notes,$source,$now,$status,$version,date('m/d/y'),$user_notes]); $new_id = $db->lastInsertId(); // AUTO CROSS-REFERENCE SCAN // Pull all existing recipes and suggest pairings based on category + ingredient keywords $existing = $db->query("SELECT id, title, category, ingredients FROM recipes WHERE id != $new_id ORDER BY id ASC")->fetchAll(PDO::FETCH_ASSOC); // Pairing rules: which categories naturally pair with which $pairing_map = [ 'sauce' => ['seafood','personal','side','fermentation'], 'seafood' => ['sauce','side'], 'personal' => ['sauce','side'], 'side' => ['sauce','seafood','personal'], 'fermentation' => ['personal','sauce'], ]; // Keyword matching for tighter suggestions $new_keywords = strtolower($title . ' ' . $category . ' ' . $ingredients); $keyword_pairs = [ 'taco' => ['taco','fish','slaw','cabbage','crema','sauce'], 'enchilada' => ['enchilada','sauce','chicken','crema'], 'chicken' => ['enchilada','sauce','soup','crema'], 'fish' => ['taco','slaw','crema','sauce'], 'slaw' => ['fish','taco','crema','cabbage'], 'crema' => ['fish','taco','slaw','enchilada'], 'pickle' => ['ferment','brine'], 'sourdough' => ['starter','bread','ferment'], ]; $suggestions = []; $target_cats = $pairing_map[$category] ?? []; foreach ($existing as $r) { $match = false; // Category match if (in_array($r['category'], $target_cats)) $match = true; // Keyword match $r_text = strtolower($r['title'] . ' ' . $r['category'] . ' ' . $r['ingredients']); foreach ($keyword_pairs as $kw => $related) { if (str_contains($new_keywords, $kw)) { foreach ($related as $rel) { if (str_contains($r_text, $rel)) { $match = true; break; } } } } if ($match) $suggestions[] = ['id' => $r['id'], 'title' => $r['title'], 'category' => $r['category']]; } echo json_encode([ 'status' => 'ok', 'id' => $new_id, 'timestamp' => $ts, 'cross_reference_suggestions' => $suggestions, 'cross_reference_note' => count($suggestions) > 0 ? 'Suggested pairings found β confirm which to link and I will add them to the recipe notes.' : 'No obvious pairings found with existing recipes.' ]); break; case 'update_recipe': $id = $_POST['id'] ?? 0; if (!$id) { echo json_encode(['status'=>'error','message'=>'id required']); break; } $allowed = ['title','category','notes','user_notes','status','version','ingredients','steps']; $sets = []; $vals = []; foreach ($allowed as $field) { if (isset($_POST[$field])) { $sets[] = "$field=?"; $vals[] = $_POST[$field]; } } if (empty($sets)) { echo json_encode(['status'=>'error','message'=>'nothing to update']); break; } $sets[] = 'last_updated=?'; $vals[] = date('m/d/y'); $vals[] = $id; $st = $db->prepare('UPDATE recipes SET ' . implode(',', $sets) . ' WHERE id=?'); $st->execute($vals); echo json_encode(['status'=>'ok','id'=>$id,'timestamp'=>$ts]); break; case 'get_recipes': $category = $_GET['category'] ?? ''; $where = $category ? "WHERE category='$category'" : ''; $rows = $db->query("SELECT * FROM recipes $where ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['status'=>'ok','count'=>count($rows),'rows'=>$rows,'timestamp'=>$ts]); break; case 'inter_system_request': // CAI Sync Comms Backbone β Phase 1 stub β T-NEW-C β 07/18/26 $cfg_raw = @file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/systems//80-kitchen//config/config.json'); $cfg_data = $cfg_raw ? json_decode($cfg_raw, true) : []; $isc_token = $cfg_data['inter_system_token'] ?? ''; $req_token = $_POST['token'] ?? ($_GET['token'] ?? ''); if (empty($isc_token) || ($req_token !== $isc_token && $req_token !== (defined('TOKEN') ? TOKEN : ''))) { http_response_code(401); echo json_encode(['status'=>'error','message'=>'Unauthorized inter-system request','decade'=>$decade_code ?? 'unknown']); break; } $from = $_POST['from_system'] ?? ($_GET['from_system'] ?? 'unknown'); $rtype = $_POST['request_type'] ?? ($_GET['request_type'] ?? 'unknown'); $rid = $_POST['request_id'] ?? ($_GET['request_id'] ?? uniqid('isc_')); echo json_encode([ 'status' => 'ok', 'message' => 'inter_system_request received', 'system' => $sys_dir ?? 'unknown', 'from_system' => $from, 'request_type' => $rtype, 'request_id' => $rid, 'phase' => '1_stub', 'timestamp' => function_exists('cai_time') ? cai_time() : date('m/d/y g:ia T') ]); break; default: echo json_encode(['status'=>'error','message'=>'Unknown action: '.$action]); }
Backend
Tools
DB Viewer
DB Admin
Server Map
File Editor