251 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			251 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|  | <?php | ||
|  | // table snippet: snippetID, snippetName, snippetDescription, snippet
 | ||
|  | // table langSnippet: intermediary table that relates snippetIDs to langIDs
 | ||
|  | // using an intermediary allows for each snippet to be related to many languages
 | ||
|  | 
 | ||
|  | include_once "dbTools.php"; | ||
|  | 
 | ||
|  | if ($_SERVER["REQUEST_METHOD"] == 'GET') { | ||
|  | 	$pdo = buildPDO(); | ||
|  | 
 | ||
|  | 	if (isset($_GET['snippetID']) && isset($_GET['langID'])) { | ||
|  | 		http_response_code(422); | ||
|  | 		header("Content-type: text/plain; charset=utf-8"); | ||
|  | 		die("Both snippetID and langID are specified. Only one can be given"); | ||
|  | 	} else if (isset($_GET['snippetID'])) { | ||
|  | 		if (trim($_GET['snippetID']) == '') { | ||
|  | 			http_response_code(422); | ||
|  | 			header("Content-type: text/plain; charset=utf-8"); | ||
|  | 			die("Empty snippetID"); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		$snippetID = $_GET['snippetID']; | ||
|  | 		$stmt = $pdo->prepare("SELECT * FROM snippet WHERE snippetID=? ORDER BY snippetID;"); | ||
|  | 		$stmt->execute([$snippetID]); | ||
|  | 		$snippets = $stmt->fetchAll(PDO::FETCH_ASSOC); | ||
|  | 
 | ||
|  | 		if (count($snippets) <= 0) { | ||
|  | 			http_response_code(404); | ||
|  | 			header("Content-type: text/plain; charset=utf-8"); | ||
|  | 			die("No such snippet"); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		$snippets = buildLangList($pdo, $snippets); | ||
|  | 
 | ||
|  | 		header("Content-type: application/json; charset=utf-8"); | ||
|  | 		echo json_encode($snippets[0]); | ||
|  | 	} elseif (isset($_GET['langID'])) { | ||
|  | 		if (trim($_GET['langID']) == '') { | ||
|  | 			http_response_code(422); | ||
|  | 			header("Content-type: text/plain; charset=utf-8"); | ||
|  | 			die("Empty langID"); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		$langID = $_GET['langID']; | ||
|  | 		$stmt = $pdo->prepare("SELECT DISTINCT snippetID, snippetName, snippetDescription, snippet FROM snippet NATURAL JOIN langSnippet WHERE langID=? ORDER BY snippetID;"); | ||
|  | 		$stmt->execute([$langID]); | ||
|  | 		$snippets = $stmt->fetchAll(PDO::FETCH_ASSOC); | ||
|  | 
 | ||
|  | 		if (count($snippets) <= 0) { | ||
|  | 			http_response_code(404); | ||
|  | 			header("Content-type: text/plain; charset=utf-8"); | ||
|  | 			die("No snippets for the given langID"); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		$snippets = buildLangList($pdo, $snippets); | ||
|  | 
 | ||
|  | 		header("Content-type: application/json; charset=utf-8"); | ||
|  | 		echo json_encode($snippets); | ||
|  | 	} else { | ||
|  | 		$stmt = $pdo->prepare("SELECT * FROM snippet ORDER BY snippetID;"); | ||
|  | 		$stmt->execute(); | ||
|  | 		$snippets = $stmt->fetchAll(PDO::FETCH_ASSOC); | ||
|  | 
 | ||
|  | 		$snippets = buildLangList($pdo, $snippets); | ||
|  | 
 | ||
|  | 		header("Content-type: application/json; charset=utf-8"); | ||
|  | 		echo json_encode($snippets); | ||
|  | 	} | ||
|  | } elseif ($_SERVER["REQUEST_METHOD"] == 'POST') { | ||
|  | 	$pdo = buildPDO(); | ||
|  | 
 | ||
|  | 	if (!isset($_POST['snippetName']) || trim($_POST['snippetName']) == '') { | ||
|  | 		http_response_code(422); | ||
|  | 		header("Content-type: text/plain; charset=utf-8"); | ||
|  | 		die("A snippet name is required"); | ||
|  | 	} | ||
|  | 	$name = trim($_POST['snippetName']); | ||
|  | 
 | ||
|  | 	$desc = ''; | ||
|  | 	if (isset($_POST['snippetDescription'])) { | ||
|  | 		$desc = trim($_POST['snippetDescription']); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	$snippet = ''; | ||
|  | 	if (isset($_POST['snippet'])) { | ||
|  | 		$snippet = trim($_POST['snippet']); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	$langID = NULL; | ||
|  | 	if (isset($_POST['langID'])) { | ||
|  | 		$langID = $_POST['langID']; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	$stmt = $pdo->prepare("INSERT INTO snippet (snippetID, snippetName, snippetDescription, snippet) VALUES (NULL, ?, ?, ?);"); | ||
|  | 	$stmt->execute([$name, $desc, $snippet]); | ||
|  | 	$snippetID = $pdo->lastInsertId(); | ||
|  | 
 | ||
|  | 	if (isset($langID)) { | ||
|  | 		$stmt = $pdo->prepare("INSERT INTO langSnippet (snippetID, langID) VALUES (?, ?);"); | ||
|  | 		$stmt->execute([$snippetID, $langID]); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	http_response_code(201); | ||
|  | 	header("Content-type: application/json; charset=utf-8"); | ||
|  | 	echo $snippetID; | ||
|  | } elseif ($_SERVER["REQUEST_METHOD"] == 'PUT') { | ||
|  | 	$pdo = buildPDO(); | ||
|  | 
 | ||
|  | 	// send request as url encoded form
 | ||
|  | 	$_PUT = array(); | ||
|  | 	parse_str(file_get_contents("php://input"), $_PUT); | ||
|  | 
 | ||
|  | 	if (!isset($_PUT['snippetID']) || trim($_PUT['snippetID']) == '') { | ||
|  | 		http_response_code(422); | ||
|  | 		header("Content-type: text/plain; charset=utf-8"); | ||
|  | 		die("snippetID is required"); | ||
|  | 	} | ||
|  | 	$snippetID = trim($_PUT['snippetID']); | ||
|  | 
 | ||
|  | 	$name = null; | ||
|  | 	if (isset($_PUT['snippetName'])) { | ||
|  | 		$name = trim($_PUT['snippetName']); | ||
|  | 	} | ||
|  | 	if (isset($name) && $name == '') { | ||
|  | 		http_response_code(422); | ||
|  | 		header("Content-type: text/plain; charset=utf-8"); | ||
|  | 		die("snippetName cannot be empty"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	$desc = null; | ||
|  | 	if (isset($_PUT['snippetDescription'])) { | ||
|  | 		$desc = trim($_PUT['snippetDescription']); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	$body = null; | ||
|  | 	if (isset($_PUT['snippet'])) { | ||
|  | 		$body = trim($_PUT['snippet']); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	$langID = null; | ||
|  | 	if (isset($_PUT['langID'])) { | ||
|  | 		$langID = trim($_PUT['langID']); | ||
|  | 	} | ||
|  | 	if (isset($langID) && $langID == '') { | ||
|  | 		http_response_code(422); | ||
|  | 		header("Content-type: text/plain; charset=utf-8"); | ||
|  | 		die("langID is empty"); | ||
|  | 	} | ||
|  | 	if (isset($langID)) { | ||
|  | 		$stmt = $pdo->prepare("SELECT * FROM langSnippet WHERE snippetID=? AND langID=?;"); | ||
|  | 		$stmt->execute([$snippetID, $langID]); | ||
|  | 		if ($stmt->rowCount() > 0) { | ||
|  | 			http_response_code(422); | ||
|  | 			header("Content-type: text/plain; charset=utf-8"); | ||
|  | 			die("The given snippetID-langID connection already exists"); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	if (isset($name)) { | ||
|  | 		$stmt = $pdo->prepare("UPDATE snippet SET snippetName=? WHERE snippetID=?;"); | ||
|  | 		$stmt->execute([$name, $snippetID]); | ||
|  | 	} | ||
|  | 	if (isset($desc)) { | ||
|  | 		$stmt = $pdo->prepare("UPDATE snippet SET snippetDescription=? WHERE snippetID=?;"); | ||
|  | 		$stmt->execute([$desc, $snippetID]); | ||
|  | 	} | ||
|  | 	if (isset($body)) { | ||
|  | 		$stmt = $pdo->prepare("UPDATE snippet SET snippet=? WHERE snippetID=?;"); | ||
|  | 		$stmt->execute([$body, $snippetID]); | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	if (isset($langID)) { | ||
|  | 		$stmt = $pdo->prepare("INSERT INTO langSnippet (snippetID, langID) VALUES (?, ?);"); | ||
|  | 		$stmt->execute([$snippetID, $langID]); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	http_response_code(204); | ||
|  | } elseif ($_SERVER["REQUEST_METHOD"] == 'DELETE') { | ||
|  | 	$pdo = buildPDO(); | ||
|  | 
 | ||
|  | 	// send request as url encoded form
 | ||
|  | 	$_DELETE = array(); | ||
|  | 	parse_str(file_get_contents("php://input"), $_DELETE); | ||
|  | 
 | ||
|  | 	// can delete either the snippet itself or an association with a lang
 | ||
|  | 	if (!isset($_DELETE['snippetID']) || trim($_DELETE['snippetID'])== '') { | ||
|  | 		http_response_code(422); | ||
|  | 		header("Content-type: text/plain; charset=utf-8"); | ||
|  | 		die("snippetID is required"); | ||
|  | 	} | ||
|  | 	$snippetID = trim($_DELETE['snippetID']); | ||
|  | 
 | ||
|  | 	$langID = null; | ||
|  | 	if (isset($_DELETE['langID'])) { | ||
|  | 		$langID = trim($_DELETE['langID']); | ||
|  | 	} | ||
|  | 	if (isset($langID) && $langID == '') { | ||
|  | 		http_response_code(422); | ||
|  | 		header("Content-type: text/plain; charset=utf-8"); | ||
|  | 		die("langId is given, but empty"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	$rows = null; | ||
|  | 	if (isset($langID)) { | ||
|  | 		$stmt = $pdo->prepare("DELETE FROM langSnippet WHERE snippetID=? AND langID=?;"); | ||
|  | 		$stmt->execute([$snippetID, $langID]); | ||
|  | 		$rows = $stmt->rowCount(); | ||
|  | 	} else { | ||
|  | 		$stmt = $pdo->prepare("DELETE FROM snippet WHERE snippetID=?;"); | ||
|  | 		$stmt->execute([$snippetID]); | ||
|  | 		$rows = $stmt->rowCount(); | ||
|  | 		if ($rows > 0) { | ||
|  | 			$stmt = $pdo->prepare("DELETE FROM langSnippet WHERE snippetID=?;"); | ||
|  | 			$stmt->execute([$snippetID]); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if ($rows == 0) { | ||
|  | 		http_response_code(404); | ||
|  | 		header("Content-type: text/plain; charset=utf-8"); | ||
|  | 		die("No such item"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	http_response_code(204); | ||
|  | } else if ($_SERVER["REQUEST_METHOD"] == 'OPTIONS') { | ||
|  | 	header("Content-type: text/plain; charset=utf-8"); | ||
|  | 	echo "Allow: GET,POST,PUT,DELETE"; | ||
|  | } else { | ||
|  | 	http_response_code(405); | ||
|  | } | ||
|  | 
 | ||
|  | function buildLangList($pdo, $snippets) { | ||
|  | 	for ($j = 0; $j < count($snippets); $j++) { | ||
|  | 		$snippetID = $snippets[$j]['snippetID']; | ||
|  | 
 | ||
|  | 		$snippets[$j]['languages'] = array(); | ||
|  | 		$stmt = $pdo->prepare("SELECT langID, langName FROM langSnippet NATURAL JOIN language WHERE snippetID=? ORDER BY langID;"); | ||
|  | 		$stmt->execute([$snippetID]); | ||
|  | 		$langList = $stmt->fetchAll(PDO::FETCH_ASSOC); | ||
|  | 		for ($i = 0; $i < count($langList); $i++) { | ||
|  | 			$snippets[$j]['languages'][$i] = $langList[$i]; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return $snippets; | ||
|  | } | ||
|  | 
 | ||
|  | ?>
 |