Add deleting mechanism
This commit is contained in:
parent
40b7d51b39
commit
7d2ae0b2d2
|
@ -9,7 +9,8 @@ $request = new Request($_SERVER);
|
|||
$handler = new RequestHandler($request);
|
||||
|
||||
$handler->registerRoutes([
|
||||
new Route('GET', 'products', ['ProductList\View\Product', 'listAll']),
|
||||
new Route('GET', 'products', ['ProductList\View\Product', 'list']),
|
||||
new Route('DELETE', 'products', ['ProductList\View\Product', 'delete']),
|
||||
new Route('GET', 'add-product', function() { readfile('static/add-product.html'); }),
|
||||
new Route('GET', '', function() { readfile('static/index.html'); }),
|
||||
]);
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
<?php
|
||||
namespace ProductList\Exception;
|
||||
|
||||
class NotFoundException extends \Exception {}
|
|
@ -5,6 +5,7 @@ class Request
|
|||
{
|
||||
private $method;
|
||||
private $uri;
|
||||
private $queryString;
|
||||
|
||||
public function getMethod()
|
||||
{
|
||||
|
@ -16,9 +17,19 @@ class Request
|
|||
return $this->uri;
|
||||
}
|
||||
|
||||
public function getQueryString()
|
||||
{
|
||||
return $this->queryString;
|
||||
}
|
||||
|
||||
public function __construct(array $params)
|
||||
{
|
||||
$this->uri = basename($params['REQUEST_URI']);
|
||||
$uri_base = trim($params['REQUEST_URI'], '?'.$params['QUERY_STRING']);
|
||||
$uri_base = trim(urldecode($uri_base), '/');
|
||||
$this->uri = explode('/', $uri_base);
|
||||
|
||||
$this->method = $params['REQUEST_METHOD'];
|
||||
|
||||
parse_str($params['QUERY_STRING'], $this->queryString);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ class Route
|
|||
public function __construct(string $method, string $uri, array|\Closure $view)
|
||||
{
|
||||
$this->method = $method;
|
||||
$this->uri = $uri;
|
||||
$this->uri = explode('/', $uri);
|
||||
$this->view = $view;
|
||||
}
|
||||
|
||||
|
|
|
@ -66,7 +66,24 @@ class Book extends Product
|
|||
$this->setVariationId($conn->insert_id);
|
||||
return $conn->insert_id;
|
||||
} else {
|
||||
throw new Exception("Unable to insert object");
|
||||
throw new \Exception("Unable to insert object");
|
||||
}
|
||||
}
|
||||
|
||||
public function delete($conn = null)
|
||||
{
|
||||
if ($conn === null) {
|
||||
$conn = Database::connect();
|
||||
}
|
||||
|
||||
$variationId = $this->getVariationId();
|
||||
$stmt = $conn->prepare('DELETE FROM '.BOOK.' WHERE id = ?');
|
||||
$stmt->bind_param('i', $variationId);
|
||||
|
||||
if ($stmt->execute() === false) {
|
||||
throw new \Exception("Unable to delete product with id '$id'");
|
||||
}
|
||||
|
||||
parent::delete($conn);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -69,4 +69,21 @@ class DVD extends Product
|
|||
throw new Exception("Unable to insert object");
|
||||
}
|
||||
}
|
||||
|
||||
public function delete($conn = null)
|
||||
{
|
||||
if ($conn === null) {
|
||||
$conn = Database::connect();
|
||||
}
|
||||
|
||||
$variationId = $this->getVariationId();
|
||||
$stmt = $conn->prepare('DELETE FROM '.DVD.' WHERE id = ?');
|
||||
$stmt->bind_param('i', $variationId);
|
||||
|
||||
if ($stmt->execute() === false) {
|
||||
throw new \Exception("Unable to delete product with id '$id'");
|
||||
}
|
||||
|
||||
parent::delete($conn);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,7 +92,24 @@ class Furniture extends Product
|
|||
$this->setVariationId($conn->insert_id);
|
||||
return $conn->insert_id;
|
||||
} else {
|
||||
throw new Exception("Unable to insert object");
|
||||
throw new \Exception("Unable to insert object");
|
||||
}
|
||||
}
|
||||
|
||||
public function delete($conn = null)
|
||||
{
|
||||
if ($conn === null) {
|
||||
$conn = Database::connect();
|
||||
}
|
||||
|
||||
$variationId = $this->getVariationId();
|
||||
$stmt = $conn->prepare('DELETE FROM '.FURNITURE.' WHERE id = ?');
|
||||
$stmt->bind_param('i', $variationId);
|
||||
|
||||
if ($stmt->execute() === false) {
|
||||
throw new \Exception("Unable to delete product with id '$id'");
|
||||
}
|
||||
|
||||
parent::delete($conn);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ trait Model
|
|||
{
|
||||
abstract public static function fromRow($row) : self;
|
||||
abstract public function insert($conn = null) : int; // should return id
|
||||
abstract public function delete($conn = null);
|
||||
abstract private static function getSelectAllQuery() : string;
|
||||
|
||||
public static function selectAll($conn = null) : array
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<?php
|
||||
namespace ProductList\Model;
|
||||
|
||||
use ProductList\Exception\NotFoundException;
|
||||
|
||||
abstract class Product implements \JsonSerializable
|
||||
{
|
||||
use Model;
|
||||
|
@ -44,6 +46,11 @@ abstract class Product implements \JsonSerializable
|
|||
return $this->productId;
|
||||
}
|
||||
|
||||
public function getVariationId()
|
||||
{
|
||||
return $this->variationId;
|
||||
}
|
||||
|
||||
public function setVariationId($id)
|
||||
{
|
||||
$this->variationId = $id;
|
||||
|
@ -56,6 +63,43 @@ abstract class Product implements \JsonSerializable
|
|||
|
||||
abstract public function getFormatedAttr();
|
||||
|
||||
public function delete($conn = null)
|
||||
{
|
||||
if ($conn === null) {
|
||||
$conn = Database::connect();
|
||||
}
|
||||
|
||||
$productId = $this->getProductId();
|
||||
$stmt = $conn->prepare('DELETE FROM '.PRODUCT.' WHERE id = ?');
|
||||
$stmt->bind_param('i', $productId);
|
||||
|
||||
if ($stmt->execute() === false) {
|
||||
throw new \Exception("Unable to delete product with id '$id'");
|
||||
}
|
||||
}
|
||||
|
||||
public static function fromId($id, $conn = null) : self
|
||||
{
|
||||
if ($conn === null) {
|
||||
$conn = Database::connect();
|
||||
}
|
||||
|
||||
$stmt = $conn->prepare(self::getSelectAllQuery().' WHERE '.PRODUCT.'.id = ?');
|
||||
$stmt->bind_param('i', $id);
|
||||
|
||||
if ($stmt->execute() === true) {
|
||||
$row = $stmt->get_result()->fetch_assoc();
|
||||
|
||||
if($row === null) {
|
||||
throw new NotFoundException("No product with id '$id'");
|
||||
}
|
||||
|
||||
return self::fromRow($row);
|
||||
} else {
|
||||
throw new \Exception("Unable to select object");
|
||||
}
|
||||
}
|
||||
|
||||
public static function fromRow($row) : self
|
||||
{
|
||||
if ($row['size'] !== null) {
|
||||
|
@ -65,7 +109,7 @@ abstract class Product implements \JsonSerializable
|
|||
} elseif ($row['height'] !== null) {
|
||||
return Furniture::fromRow($row);
|
||||
} else {
|
||||
throw new Exception("Product without a type");
|
||||
throw new \Exception("Product without a type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -77,7 +121,7 @@ abstract class Product implements \JsonSerializable
|
|||
FROM '.PRODUCT.'
|
||||
LEFT JOIN '.DVD.' ON '.PRODUCT.'.id = '.DVD.'.product_id
|
||||
LEFT JOIN '.BOOK.' ON '.PRODUCT.'.id = '.BOOK.'.product_id
|
||||
LEFT JOIN '.FURNITURE.' ON '.PRODUCT.'.id = '.FURNITURE.'.product_id;';
|
||||
LEFT JOIN '.FURNITURE.' ON '.PRODUCT.'.id = '.FURNITURE.'.product_id';
|
||||
}
|
||||
|
||||
public function insert($conn = null) : int
|
||||
|
@ -100,7 +144,7 @@ abstract class Product implements \JsonSerializable
|
|||
$this->setProductId($conn->insert_id);
|
||||
return $conn->insert_id;
|
||||
} else {
|
||||
throw new Exception("Unable to insert object");
|
||||
throw new \Exception("Unable to insert object");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,11 +3,48 @@ namespace ProductList\View;
|
|||
|
||||
use ProductList\Http\Request;
|
||||
use ProductList\Model\Product as ProductModel;
|
||||
use ProductList\Exception\NotFoundException;
|
||||
|
||||
class Product
|
||||
{
|
||||
public static function listAll(Request $request)
|
||||
public static function list(Request $request)
|
||||
{
|
||||
echo json_encode(ProductModel::selectAll());
|
||||
}
|
||||
|
||||
public static function delete(Request $request)
|
||||
{
|
||||
$queryString = $request->getQueryString();
|
||||
|
||||
if (array_key_exists('id', $queryString)) {
|
||||
$ids = explode(',', $queryString['id']);
|
||||
$ids = array_map('intval', $ids);
|
||||
|
||||
foreach($ids as $id) {
|
||||
try {
|
||||
$product = ProductModel::fromId($id);
|
||||
|
||||
try {
|
||||
$product->delete();
|
||||
} catch (\Exception $e) {
|
||||
http_response_code(500);
|
||||
echo $e->getMessage();
|
||||
return;
|
||||
}
|
||||
|
||||
} catch (NotFoundException $e) {
|
||||
http_response_code(404);
|
||||
echo $e->getMessage();
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
http_response_code(400);
|
||||
echo 'Missing parameter "id".';
|
||||
}
|
||||
}
|
||||
|
||||
public static function add(Request $request)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ const deleteSelected = () => {
|
|||
loadItems();
|
||||
}
|
||||
|
||||
xhttp.open('DELETE', 'products', true);
|
||||
xhttp.open('DELETE', `products?id=${values.join(',')}`, true);
|
||||
xhttp.send();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue