SnippetManager/resource.php

239 lines
7.0 KiB
PHP

<?php
// resourceID, resourceName, resourceDescription, resourceLink
// intermediary table that relates resourceIDs 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['resourseID']) && isset($_GET['langID'])) {
http_response_code(422);
header("Content-type: text/plain; charset=utf-8");
die("Both resourceID and langID are specified. Only one can be given");
} else if (isset($_GET['resourceID'])) {
if (trim($_GET['resourceID']) == '') {
http_response_code(422);
header("Content-type: text/plain; charset=utf-8");
die("Empty resourceID");
}
$resourceID = $_GET['resourceID'];
$stmt = $pdo->prepare("SELECT * FROM resource WHERE resourceID=?;");
$stmt->execute([$resourceID]);
$resources = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (count($resources) <= 0) {
http_response_code(404);
header("Content-type: text/plain; charset=utf-8");
die("No such resource");
}
$resources = buildLangList($pdo, $resources);
header("Content-type: application/json; charset=utf-8");
echo json_encode($resources[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 resourceID, resourceName, resourceDescription, resourceLink FROM resource NATURAL JOIN langResource WHERE langID=? ORDER BY resourceID;");
$stmt->execute([$langID]);
$resources = $stmt->fetchAll(PDO::FETCH_ASSOC);
$resources = buildLangList($pdo, $resources);
header("Content-type: application/json; charset=utf-8");
echo json_encode($resources);
} else {
$stmt = $pdo->prepare("SELECT * FROM resource ORDER BY resourceID;");
$stmt->execute();
$resources = $stmt->fetchAll(PDO::FETCH_ASSOC);
$resources = buildLangList($pdo, $resources);
header("Content-type: application/json; charset=utf-8");
echo json_encode($resources);
}
} elseif ($_SERVER["REQUEST_METHOD"] == 'POST') {
$pdo = buildPDO();
if (!isset($_POST['resourceName']) || trim($_POST['resourceName']) == '') {
http_response_code(422);
header("Content-type: text/plain; charset=utf-8");
die("A resourceName is required");
}
$name = $_POST['resourceName'];
$desc = '';
if (isset($_POST['resourceDescription'])) {
$desc = trim($_POST['resourceDescription']);
}
$link = '';
if (isset($_POST['resourceLink'])) {
$link = trim($_POST['resourceLink']);
}
$langID = NULL;
if (isset($_POST['langID'])) {
$langID = $_POST['langID'];
}
$stmt = $pdo->prepare("INSERT INTO resource (resourceID, resourceName, resourceDescription, resourceLink) VALUES (NULL, ?, ?, ?);");
$stmt->execute([$name, $desc, $link]);
$resourceID = $pdo->lastInsertId();
if (isset($langID)) {
$stmt = $pdo->prepare("INSERT INTO langResource (resourceID, langID) VALUES (?, ?);");
$stmt->execute([$resourceID, $langID]);
}
http_response_code(201);
header("Content-type: text/plain; charset=utf-8");
echo $resourceID;
} 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['resourceID']) && trim($_PUT['resourceID']) == '') {
http_response_code(422);
header("Content-type: text/plain; charset=utf-8");
die("resourceID is required");
}
$resourceID = trim($_PUT['resourceID']);
$name = null;
if (isset($_PUT['resourceName'])) {
$name = trim($_PUT['resourceName']);
}
$desc = null;
if (isset($_PUT['resourceDescription'])) {
$desc = trim($_PUT['resourceDescription']);
}
$link = null;
if (isset($_PUT['resourceLink'])) {
$link = trim($_PUT['resourceLink']);
}
$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 langResource WHERE resourceID=? AND langID=?;");
$stmt->execute([$resourceID, $langID]);
if ($stmt->rowCount() > 0) {
http_response_code(422);
header("Content-type: text/plain; charset=utf-8");
die("The given resourceID-langID connection already exists");
}
}
if (isset($name)) {
$stmt = $pdo->prepare("UPDATE resource SET resourceName=? WHERE resourceID=?;");
$stmt->execute([$name, $resourceID]);
}
if (isset($desc)) {
$stmt = $pdo->prepare("UPDATE resource SET resourceDescription=? WHERE resourceID=?;");
$stmt->execute([$desc, $resourceID]);
}
if (isset($link)) {
$stmt = $pdo->prepare("UPDATE resource SET resourceLink=? WHERE resourceID=?;");
$stmt->execute([$link, $resourceID]);
}
if (isset($langID)) {
$stmt = $pdo->prepare("INSERT INTO langResource (resourceID, langID) VALUES (?, ?);");
$stmt->execute([$resourceID, $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['resourceID']) || trim($_DELETE['resourceID'])== '') {
http_response_code(422);
header("Content-type: text/plain; charset=utf-8");
die("snippetID is required");
}
$resourceID = trim($_DELETE['resourceID']);
$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 langResource WHERE resourceID=? AND langID=?;");
$stmt->execute([$resourceID, $langID]);
$rows = $stmt->rowCount();
} else {
$stmt = $pdo->prepare("DELETE FROM resource WHERE resourceID=?;");
$stmt->execute([$resourceID]);
$rows = $stmt->rowCount();
if ($rows > 0) {
$stmt = $pdo->prepare("DELETE FROM langResource WHERE resourceID=?;");
$stmt->execute([$resourceID]);
}
}
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, $resources) {
for ($j = 0; $j < count($resources); $j++) {
$resourceID = $resources[$j]['resourceID'];
$resources[$j]['languages'] = array();
$stmt = $pdo->prepare("SELECT langID, langName FROM langResource NATURAL JOIN language WHERE resourceID=? ORDER BY langID;");
$stmt->execute([$resourceID]);
$langList = $stmt->fetchAll(PDO::FETCH_ASSOC);
for ($i = 0; $i < count($langList); $i++) {
$resources[$j]['languages'][$i] = $langList[$i];
}
}
return $resources;
}
?>