Created
July 6, 2020 18:35
-
-
Save harryWonder/25c8a0c8499b81c121770cb9346d3e65 to your computer and use it in GitHub Desktop.
This file provides C.R.U.D functionalities for the Product Entity.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App; | |
use App\UserModel; | |
use App\Controller; | |
use App\ProductModel; | |
use App\JwtMiddleware; | |
use App\RequestMiddleware; | |
/** | |
* ProductController - The ProductController. This Controller makes use of a few Models for creating, updating, fetching and deleting Products. | |
* | |
* @author Ilori Stephen A <stephenilori458@gmail.com> | |
* @link https://github.com/learningdollars/php-rest-api/App/Controller/ProductController.php | |
* @license MIT | |
*/ | |
class ProductController extends Controller { | |
/** | |
* createProduct | |
* | |
* Creates a new Product. | |
* | |
* @param mixed $request $response Contains the Request and Respons Object from the router. | |
* @return mixed Anonymous | |
*/ | |
public function createProduct($request, $response) | |
{ | |
$Response = []; | |
// Call the JSON Middleware | |
$FormDataMiddleware = new RequestMiddleware(); | |
$formData = $FormDataMiddleware::acceptsFormData(); | |
if (!$formData) { | |
array_push($Response, [ | |
'status' => 400, | |
'message' => 'Sorry, Only Multipart Form Data Contents are allowed to access this Endpoint.', | |
'data' => [] | |
]); | |
$response->code(400)->json($Response); | |
return; | |
} | |
$JwtMiddleware = new JwtMiddleware(); | |
$jwtMiddleware = $JwtMiddleware::getAndDecodeToken(); | |
if (isset($jwtMiddleware) && $jwtMiddleware == false) { | |
$response->code(400)->json([ | |
'status' => 401, | |
'message' => 'Sorry, the authenticity of this token could not be verified.', | |
'data' => [] | |
]); | |
return; | |
} | |
$Data = $request->paramsPost(); | |
$validationObject = array( | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->name) ? $Data->name : '', | |
'key' => 'Product Name' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->catalog_id) ? $Data->catalog_id : '', | |
'key' => 'Product Catalog' | |
], | |
(Object) [ | |
'validator' => 'catalogExists', | |
'data' => isset($Data->catalog_id) ? $Data->catalog_id : '', | |
'key' => 'Product Catalog' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->price) ? $Data->price : '', | |
'key' => 'Product Price' | |
], | |
(Object) [ | |
'validator' => 'numeric', | |
'data' => isset($Data->price) ? $Data->price : '', | |
'key' => 'Product Price' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->color) ? $Data->color : '', | |
'key' => 'Product Color' | |
], | |
(Object) [ | |
'validator' => 'string', | |
'data' => isset($Data->color) ? $Data->color : '', | |
'key' => 'Product Color' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->size) ? $Data->size : '', | |
'key' => 'Product Size' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => !empty($request->files()->banner) ? $request->files()->banner : '', | |
'key' => 'Product Banner', | |
], | |
(Object) [ | |
'validator' => 'img', | |
'data' => !empty($request->files()->banner) ? $request->files()->banner : '', | |
'key' => 'Product Banner', | |
'file_name' => 'banner', | |
'acceptedExtension' => ['jpg', 'png', 'gif', 'jpeg'], | |
'maxSize' => 5000000 | |
], | |
); | |
$validationBag = Parent::validation($validationObject); | |
if ($validationBag->status) { | |
$response->code(400)->json($validationBag); | |
return; | |
} | |
// Work the banner image... | |
$bannerPath = './public/img/'; | |
$bannerName = time() . '_' . basename($request->files()->banner['name']); | |
if (!move_uploaded_file($request->files()->banner['tmp_name'], $bannerPath . $bannerName)) { | |
$Response['status'] = 400; | |
$Response['data'] = []; | |
$Response['message'] = 'An unexpected error occuured and your file could not be uploaded. Please, try again later.'; | |
$response->code(400)->json($Response); | |
return; | |
} | |
// create the product... | |
$Payload = array( | |
'name' => htmlentities(stripcslashes(strip_tags($Data->name))), | |
'catalog_id' => (int) htmlentities(stripcslashes(strip_tags($Data->catalog_id))), | |
'color' => htmlentities(stripcslashes(strip_tags($Data->color))), | |
'price' => (float) htmlentities(stripcslashes(strip_tags($Data->price))), | |
'size' => \htmlentities(\stripcslashes(strip_tags($Data->size))), | |
'banner' => 'public/img/' . $bannerName, | |
'created_at' => date('Y-m-d H:i:s'), | |
'updated_at' => date('Y-m-d H:i:s') | |
); | |
try { | |
$ProductModel = new ProductModel(); | |
$product = $ProductModel::createProduct($Payload); | |
if ($product['status']) { | |
$Response['status'] = 201; | |
$Response['data'] = $product['data']; | |
$Response['message'] = ''; | |
$response->code(201)->json($Response); | |
return; | |
} | |
$Response['status'] = 400; | |
$Response['data'] = []; | |
$Response['message'] = 'An unexpected error occurred and your product could not be created. Please, try again later.'; | |
$response->code(400)->json($Response); | |
return; | |
} catch (Exception $e) { | |
$Response['status'] = 500; | |
$Response['message'] = $e->getMessage(); | |
$Response['data'] = []; | |
$response->code(500)->json($Response); | |
return; | |
} | |
} | |
/** | |
* updateProduct | |
* | |
* Updates a Product. | |
* | |
* @param mixed $request $response Contains the Request and Respons Object from the router. | |
* @return mixed Anonymous | |
*/ | |
public function updateProduct($request, $response) | |
{ | |
$Response = []; | |
// Call the JSON Middleware | |
$ProductModel = new ProductModel(); | |
$FormDataMiddleware = new RequestMiddleware(); | |
$formData = $FormDataMiddleware::acceptsFormData(); | |
if (!$formData) { | |
array_push($Response, [ | |
'status' => 400, | |
'message' => 'Sorry, Only Multipart Form Data Contents are allowed to access this Endpoint.', | |
'data' => [] | |
]); | |
$response->code(400)->json($Response); | |
return; | |
} | |
$JwtMiddleware = new JwtMiddleware(); | |
$jwtMiddleware = $JwtMiddleware::getAndDecodeToken(); | |
if (isset($jwtMiddleware) && $jwtMiddleware == false) { | |
$response->code(400)->json([ | |
'status' => 401, | |
'message' => 'Sorry, the authenticity of this token could not be verified.', | |
'data' => [] | |
]); | |
return; | |
} | |
$Data = $request->paramsPost(); | |
$validationObject = array( | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($request->id) ? $request->id : '', | |
'key' => 'Product ID' | |
], | |
(Object) [ | |
'validator' => 'productExists', | |
'data' => isset($request->id) ? $request->id : '', | |
'key' => 'Product Id' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->name) ? $Data->name : '', | |
'key' => 'Product Name' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->catalog_id) ? $Data->catalog_id : '', | |
'key' => 'Product Catalog' | |
], | |
(Object) [ | |
'validator' => 'catalogExists', | |
'data' => isset($Data->catalog_id) ? $Data->catalog_id : '', | |
'key' => 'Product Catalog' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->price) ? $Data->price : '', | |
'key' => 'Product Price' | |
], | |
(Object) [ | |
'validator' => 'numeric', | |
'data' => isset($Data->price) ? $Data->price : '', | |
'key' => 'Product Price' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->color) ? $Data->color : '', | |
'key' => 'Product Color' | |
], | |
(Object) [ | |
'validator' => 'string', | |
'data' => isset($Data->color) ? $Data->color : '', | |
'key' => 'Product Color' | |
], | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($Data->size) ? $Data->size : '', | |
'key' => 'Product Size' | |
], | |
(Object) [ | |
'validator' => !empty($request->files()->banner) ? 'img' : 'nullable', | |
'data' => !empty($request->files()->banner) ? $request->files()->banner : '', | |
'key' => 'Product Banner', | |
'file_name' => 'banner', | |
'acceptedExtension' => ['jpg', 'png', 'gif', 'jpeg'], | |
'maxSize' => 5000000 | |
], | |
); | |
$validationBag = Parent::validation($validationObject); | |
if ($validationBag->status) { | |
$response->code(400)->json($validationBag); | |
return; | |
} | |
// Work the banner image... | |
$banner = 'public/img/'; | |
if (!empty($request->files()->banner)) { | |
$product = $ProductModel::findProductById($request->id)['data']; | |
if (file_exists($product['banner'])) { | |
unlink($product['banner']); | |
} | |
$bannerPath = './public/img/'; | |
$bannerName = time() . '_' . basename($request->files()->banner['name']); | |
if (!move_uploaded_file($request->files()->banner['tmp_name'], $bannerPath . $bannerName)) { | |
$Response['status'] = 400; | |
$Response['data'] = []; | |
$Response['message'] = 'An unexpected error occuured and your file could not be uploaded. Please, try again later.'; | |
$response->code(400)->json($Response); | |
return; | |
} | |
$banner .= $bannerName; | |
} | |
// create the product... | |
$Payload = array( | |
'id' => $request->id, | |
'name' => htmlentities(stripcslashes(strip_tags($Data->name))), | |
'catalog_id' => (int) htmlentities(stripcslashes(strip_tags($Data->catalog_id))), | |
'color' => htmlentities(stripcslashes(strip_tags($Data->color))), | |
'price' => (float) htmlentities(stripcslashes(strip_tags($Data->price))), | |
'size' => \htmlentities(\stripcslashes(strip_tags($Data->size))), | |
'banner' => $banner, | |
'updated_at' => date('Y-m-d H:i:s') | |
); | |
try { | |
$product = $ProductModel::updateProduct($Payload); | |
if ($product['status']) { | |
$product['data'] = $ProductModel::findProductById($request->id)['data']; | |
$Response['status'] = 200; | |
$Response['data'] = $product['data']; | |
$Response['message'] = ''; | |
$response->code(200)->json($Response); | |
return; | |
} | |
$Response['status'] = 400; | |
$Response['data'] = []; | |
$Response['message'] = 'An unexpected error occurred and your product could not be updated. Please, try again later.'; | |
$response->code(400)->json($Response); | |
return; | |
} catch (Exception $e) { | |
$Response['status'] = 500; | |
$Response['message'] = $e->getMessage(); | |
$Response['data'] = []; | |
$response->code(500)->json($Response); | |
return; | |
} | |
} | |
/** | |
* getProductById | |
* | |
* Gets a Product by it's ID | |
* | |
* @param mixed $request $response Contains the Request and Respons Object from the router. | |
* @return mixed Anonymous | |
*/ | |
public function getProductById($request, $response) | |
{ | |
$Response = []; | |
// Call the Middleware | |
$ProductModel = new ProductModel(); | |
$JwtMiddleware = new JwtMiddleware(); | |
$jwtMiddleware = $JwtMiddleware::getAndDecodeToken(); | |
if (isset($jwtMiddleware) && $jwtMiddleware == false) { | |
$response->code(400)->json([ | |
'status' => 401, | |
'message' => 'Sorry, the authenticity of this token could not be verified.', | |
'data' => [] | |
]); | |
return; | |
} | |
$validationObject = array( | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($request->id) ? $request->id : '', | |
'key' => 'Product ID' | |
], | |
(Object) [ | |
'validator' => 'productExists', | |
'data' => isset($request->id) ? $request->id : '', | |
'key' => 'Product Id' | |
], | |
); | |
$validationBag = Parent::validation($validationObject); | |
if ($validationBag->status) { | |
$response->code(400)->json($validationBag); | |
return; | |
} | |
try { | |
$ProductModel = new ProductModel(); | |
$product = $ProductModel::findProductById($request->id); | |
if ($product['status']) { | |
$Response['status'] = 200; | |
$Response['data'] = $product['data']; | |
$Response['message'] = ''; | |
$response->code(200)->json($Response); | |
return; | |
} | |
$Response['status'] = 400; | |
$Response['data'] = []; | |
$Response['message'] = 'An unexpected error occurred and your product could not be retrieved. Please, try again later.'; | |
$response->code(400)->json($Response); | |
return; | |
} catch (Exception $e) { | |
$Response['status'] = 500; | |
$Response['message'] = $e->getMessage(); | |
$Response['data'] = []; | |
$response->code(500)->json($Response); | |
return; | |
} | |
} | |
/** | |
* fetchProducts | |
* | |
* Fetches an Array of products.... | |
* | |
* @param mixed $request $response Contains the Request and Respons Object from the router. | |
* @return mixed Anonymous | |
*/ | |
public function fetchProducts($request, $response) | |
{ | |
$Response = []; | |
// Call the Middleware | |
$ProductModel = new ProductModel(); | |
$JwtMiddleware = new JwtMiddleware(); | |
$jwtMiddleware = $JwtMiddleware::getAndDecodeToken(); | |
if (isset($jwtMiddleware) && $jwtMiddleware == false) { | |
$response->code(400)->json([ | |
'status' => 401, | |
'message' => 'Sorry, the authenticity of this token could not be verified.', | |
'data' => [] | |
]); | |
return; | |
} | |
try { | |
$ProductModel = new ProductModel(); | |
$products = $ProductModel::fetchProducts(); | |
if ($products['status']) { | |
$Response['status'] = 200; | |
$Response['data'] = $products['data']; | |
$Response['message'] = ''; | |
$response->code(200)->json($Response); | |
return; | |
} | |
$Response['status'] = 400; | |
$Response['data'] = []; | |
$Response['message'] = 'An unexpected error occurred and your product could not be retrieved. Please, try again later.'; | |
$response->code(400)->json($Response); | |
return; | |
} catch (Exception $e) { | |
$Response['status'] = 500; | |
$Response['message'] = $e->getMessage(); | |
$Response['data'] = []; | |
$response->code(500)->json($Response); | |
return; | |
} | |
} | |
/** | |
* deleteProduct | |
* | |
* Deletes a Product by it'd ID | |
* | |
* @param mixed $request $response Contains the Request and Respons Object from the router. | |
* @return mixed Anonymous | |
*/ | |
public function deleteProduct($request, $response) | |
{ | |
$Response = []; | |
// Call the Middleware | |
$ProductModel = new ProductModel(); | |
$JwtMiddleware = new JwtMiddleware(); | |
$jwtMiddleware = $JwtMiddleware::getAndDecodeToken(); | |
if (isset($jwtMiddleware) && $jwtMiddleware == false) { | |
$response->code(400)->json([ | |
'status' => 401, | |
'message' => 'Sorry, the authenticity of this token could not be verified.', | |
'data' => [] | |
]); | |
return; | |
} | |
$validationObject = array( | |
(Object) [ | |
'validator' => 'required', | |
'data' => isset($request->id) ? $request->id : '', | |
'key' => 'Product ID' | |
], | |
(Object) [ | |
'validator' => 'productExists', | |
'data' => isset($request->id) ? $request->id : '', | |
'key' => 'Product Id' | |
], | |
); | |
$validationBag = Parent::validation($validationObject); | |
if ($validationBag->status) { | |
$response->code(400)->json($validationBag); | |
return; | |
} | |
try { | |
$ProductModel = new ProductModel(); | |
$product = $ProductModel::deleteProduct($request->id); | |
if ($product['status']) { | |
$Response['status'] = 200; | |
$Response['data'] = []; | |
$Response['message'] = ''; | |
$response->code(200)->json($Response); | |
return; | |
} | |
$Response['status'] = 400; | |
$Response['data'] = []; | |
$Response['message'] = 'An unexpected error occurred and your product could not be deleted. Please, try again later.'; | |
$response->code(400)->json($Response); | |
return; | |
} catch (Exception $e) { | |
$Response['status'] = 500; | |
$Response['message'] = $e->getMessage(); | |
$Response['data'] = []; | |
$response->code(500)->json($Response); | |
return; | |
} | |
} | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment