⚝
One Hat Cyber Team
⚝
Your IP:
216.73.217.70
Server IP:
209.74.65.82
Server:
Linux 209-74-65-82.cprapid.com 5.14.0-427.42.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Nov 1 14:58:02 EDT 2024 x86_64
PHP Version:
8.1.34
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
home
/
ivsoxidh
/
tasks.ivsoftdesign.com
/
Edit File: api.php
<?php header('Content-Type: application/json; charset=UTF-8'); $action = $_GET['action'] ?? ''; $input = json_decode(file_get_contents('php://input'), true) ?: []; try { switch ($action) { case 'list_boards': echo json_encode(['boards'=> list_boards()]); break; case 'create_board': require_fields($input, ['title']); echo json_encode(create_board($input['title'])); break; case 'rename_board': require_fields($input, ['id','title']); echo json_encode(rename_board($input['id'],$input['title'])); break; case 'delete_board': require_fields($input, ['id']); echo json_encode(delete_board($input['id'])); break; case 'get_board': require_fields($input, ['id']); echo json_encode(['board'=> get_board($input['id'])]); break; case 'add_list': require_fields($input, ['board_id','title']); echo json_encode(add_list($input['board_id'],$input['title'])); break; case 'rename_list': require_fields($input, ['board_id','list_id','title']); echo json_encode(rename_list($input['board_id'],$input['list_id'],$input['title'])); break; case 'delete_list': require_fields($input, ['board_id','list_id']); echo json_encode(delete_list($input['board_id'],$input['list_id'])); break; case 'add_card': require_fields($input, ['board_id','list_id','title']); echo json_encode(add_card($input['board_id'],$input['list_id'],$input['title'],$input['desc']??'')); break; case 'update_card': require_fields($input, ['board_id','card_id']); echo json_encode(update_card($input['board_id'],$input['card_id'],$input['title']??null,$input['desc']??null)); break; case 'delete_card': require_fields($input, ['board_id','card_id']); echo json_encode(delete_card($input['board_id'],$input['card_id'])); break; case 'move_card': require_fields($input, ['board_id','card_id','to_list_id','position']); echo json_encode(move_card($input['board_id'],$input['card_id'],$input['to_list_id'], (int)$input['position'])); break; default: http_response_code(400); echo json_encode(['error'=>'Unknown action']); } } catch (Throwable $e) { http_response_code(500); echo json_encode(['error'=>$e->getMessage()]); } /* ===== Storage helpers ===== */ function boards_dir(){ $d=__DIR__.'/storage/boards'; if(!is_dir($d)) @mkdir($d, 0700, true); return $d; } function index_path(){ return boards_dir().'/_index.json'; } function board_path($id){ return boards_dir().'/'.$id.'.json'; } function uuid4(){ $d = random_bytes(16); $d[6] = chr((ord($d[6]) & 0x0f) | 0x40); $d[8] = chr((ord($d[8]) & 0x3f) | 0x80); $hex = bin2hex($d); return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split($hex, 4)); } function now(){ return date('c'); } function read_json($path, $def){ return file_exists($path) ? (json_decode(file_get_contents($path), true) ?: $def) : $def; } function write_json($path, $data){ file_put_contents($path, json_encode($data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT), LOCK_EX); } /* ===== API: boards ===== */ function list_boards(){ $idx = read_json(index_path(), ['boards'=>[]]); // sort by updated desc usort($idx['boards'], function($a,$b){ return strcmp($b['updated'] ?? $b['created'] ?? '', $a['updated'] ?? $a['created'] ?? ''); }); return $idx['boards']; } function create_board($title){ $title = trim($title) ?: 'Непоименуван борд'; $id = uuid4(); $now = now(); $idx = read_json(index_path(), ['boards'=>[]]); $idx['boards'][] = ['id'=>$id,'title'=>$title,'created'=>$now,'updated'=>$now]; write_json(index_path(), $idx); $board = [ 'id'=>$id, 'title'=>$title, 'created'=>$now, 'updated'=>$now, 'lists'=>[ ['id'=>uuid4(),'title'=>'To Do','cards'=>[]], ['id'=>uuid4(),'title'=>'In Progress','cards'=>[]], ['id'=>uuid4(),'title'=>'Done','cards'=>[]], ], ]; write_json(board_path($id), $board); return ['ok'=>true, 'id'=>$id]; } function rename_board($id, $title){ $idx = read_json(index_path(), ['boards'=>[]]); foreach($idx['boards'] as &$b){ if($b['id']===$id){ $b['title']=trim($title)?:$b['title']; $b['updated']=now(); break; } } write_json(index_path(), $idx); $board = get_board($id); $board['title'] = trim($title) ?: $board['title']; $board['updated'] = now(); write_json(board_path($id), $board); return ['ok'=>true]; } function delete_board($id){ $idx = read_json(index_path(), ['boards'=>[]]); $idx['boards'] = array_values(array_filter($idx['boards'], fn($b)=>$b['id']!==$id)); write_json(index_path(), $idx); $p = board_path($id); if(file_exists($p)) @unlink($p); return ['ok'=>true]; } function get_board($id){ $p = board_path($id); $board = read_json($p, null); if(!$board){ throw new RuntimeException('Board not found'); } return $board; } /* ===== API: lists ===== */ function add_list($board_id, $title){ $b = get_board($board_id); $b['lists'][] = ['id'=>uuid4(),'title'=>trim($title)?:'List','cards'=>[]]; $b['updated'] = now(); write_json(board_path($board_id), $b); bump_index($board_id); return ['ok'=>true]; } function rename_list($board_id, $list_id, $title){ $b = get_board($board_id); foreach($b['lists'] as &$l){ if($l['id']===$list_id){ $l['title']=trim($title)?:$l['title']; break; } } $b['updated']=now(); write_json(board_path($board_id), $b); bump_index($board_id); return ['ok'=>true]; } function delete_list($board_id, $list_id){ $b = get_board($board_id); $b['lists'] = array_values(array_filter($b['lists'], fn($l)=>$l['id']!==$list_id)); $b['updated']=now(); write_json(board_path($board_id), $b); bump_index($board_id); return ['ok'=>true]; } /* ===== API: cards ===== */ function add_card($board_id, $list_id, $title, $desc){ $b = get_board($board_id); foreach($b['lists'] as &$l){ if($l['id']===$list_id){ $l['cards'][] = ['id'=>uuid4(),'title'=>trim($title)?:'Card','desc'=>trim($desc??''),'created'=>now(),'updated'=>now()]; break; } } $b['updated']=now(); write_json(board_path($board_id), $b); bump_index($board_id); return ['ok'=>true]; } function update_card($board_id, $card_id, $title=null, $desc=null){ $b = get_board($board_id); foreach($b['lists'] as &$l){ foreach($l['cards'] as &$c){ if($c['id']===$card_id){ if($title!==null) $c['title']=trim($title)?:$c['title']; if($desc!==null) $c['desc']=trim($desc); $c['updated']=now(); break 2; } } } $b['updated']=now(); write_json(board_path($board_id), $b); bump_index($board_id); return ['ok'=>true]; } function delete_card($board_id, $card_id){ $b = get_board($board_id); foreach($b['lists'] as &$l){ $l['cards'] = array_values(array_filter($l['cards'], fn($c)=>$c['id']!==$card_id)); } $b['updated']=now(); write_json(board_path($board_id), $b); bump_index($board_id); return ['ok'=>true]; } function move_card($board_id, $card_id, $to_list_id, $position){ $b = get_board($board_id); $card = null; // remove from current list foreach($b['lists'] as &$l){ foreach($l['cards'] as $i=>$c){ if($c['id']===$card_id){ $card = $c; array_splice($l['cards'], $i, 1); break 2; } } } if(!$card) throw new RuntimeException('Card not found'); // add to target list at position foreach($b['lists'] as &$l){ if($l['id']===$to_list_id){ $position = max(0, min((int)$position, count($l['cards']))); array_splice($l['cards'], $position, 0, [$card]); break; } } $b['updated']=now(); write_json(board_path($board_id), $b); bump_index($board_id); return ['ok'=>true]; } /* ===== Misc ===== */ function bump_index($id){ $idx = read_json(index_path(), ['boards'=>[]]); foreach($idx['boards'] as &$b){ if($b['id']===$id){ $b['updated']=now(); break; } } write_json(index_path(), $idx); } function require_fields($arr, $keys){ foreach($keys as $k){ if(!array_key_exists($k, $arr)){ http_response_code(400); echo json_encode(['error'=>"Missing $k"]); exit; } } }
Simpan