Initial Commit

This commit is contained in:
GiacomoHome
2021-09-17 12:41:45 +02:00
commit 9001e4656e
570 changed files with 31013 additions and 0 deletions
@@ -0,0 +1,393 @@
<?php
abstract class App_Controller_Rest_MongoController extends Zend_Rest_Controller
{
public $_resourceName;
public $_responseData;
public $_status;
public $_inArray;
public $_mongoModel;
public function init()
{
$this->_helper->viewRenderer->setNoRender(true);
$this->_helper->AjaxContext()
->addActionContext('get', 'json')
->addActionContext('post', 'json')
->addActionContext('put', 'json')
->addActionContext('patch', 'json')
->addActionContext('delete', 'json')
->addActionContext('options', 'json')
->addActionContext('head', 'json')
->initContext('json');
}
public function preDispatch()
{
$this->_responseData = new stdClass();
$this->_status = false;
$this->_inArray = false;
$this->_mongoModel = new App_Model_Mongo_Client();
$this->_response->setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Authorization,x-requested-with,Content-Type,Cache-Control,X-As-Dev-On,X-As-Dev-Pw');
$this->_response->setHeader('Access-Control-Expose-Headers', 'X-Tot-Items, X-Page,X-Count,X-Tot-Filtered');
$this->_response->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, PATCH, DELETE');
$this->_response->setHeader('Access-Control-Allow-Origin', '*');
$this->_response->setHeader('Access-Control-Allow-Credentials', 'true');
// Controllo sui metodi di prefetch
if($_SERVER['REQUEST_METHOD'] === 'OPTIONS'){
return $this->optionsAction();
}
if($_SERVER['REQUEST_METHOD'] === 'HEAD'){
return $this->optionsAction();
}
if($_SERVER['REQUEST_METHOD'] === 'PATCH'){
return $this->patchAction();
}
}
//##################################### CRUD FUNCTIONS #############################################################
public function indexAction()
{
$this->getAction();
}
public function getAction()
{
try {
switch ($this->_getParam('method')) {
default:
if ($this->_getParam('id') != null) {
$this->_responseData->data = $this->getSingleElement($this->_getParam('id'));
} else {
$this->_inArray = true;
$page = intval($this->_getParam('page', null));
$count = intval($this->_getParam('count', null));
$order = $this->_getParam('order', null);
//$projection = $this->_helper->MongoProjectionFunctions($this->_getParam('select', null), $this->_defaultProjection);
$projection = $this->_getParam('select', null);
$addFields = null;
$where = $this->_helper->MongoFilterFunctions($this->getAllParams());
$where = $this->handleGetListFilters($where);
$data = $this->_mongoModel->getListAggregation($this->_resourceName, $page, $count, $where, $order, $projection, $addFields);
// Zend_Registry::get('log')->info(print_r($data,true));
$this->_responseData->data = $data;
}
break;
}
$this->_status = true;
$this->sendResponse();
} catch (Exception $e) {
$this->_status = false;
$this->_responseData->message = $e->getMessage();
$this->sendResponse();
}
}
public function postAction()
{
try {
$params = Zend_Json::decode($this->getRequest()->getRawBody());
$form = $this->getAddFormForResource();
//Inserimento di un singolo elemento
if (!$form->isValid($params)) {
$this->_status = false;
$this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID;
$this->_responseData->message = 'I dati inseriti non sono validi';
$this->_responseData->errorDetails = $form->getMessages();
$this->sendResponse();
}
$dati = $form->getValues();
$dati = $this->preInsertElement($dati);
$dati['id'] = $this->insertSingleElement($dati);
$dati = $this->afterInsertElement($dati);
$this->_responseData->data = array('data' => $dati);
$this->_status = true;
$this->sendResponse();
} catch (Exception $e) {
$this->_responseData->message = $e->getMessage();
$this->sendResponse();
}
}
public function putAction()
{
try {
$params = Zend_Json::decode($this->getRequest()->getRawBody());
$form = $this->getAddFormForResource();
//Aggiornamento singolo
if (!$form->isValidPartial($params)) {
$this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID;
$this->_responseData->message = 'I dati inseriti non sono validi';
$this->_responseData->errorDetails = $form->getMessages();
$this->sendResponse();
}
$dati = $form->getValues();
if (!$this->_getParam('id')) {
$this->_responseData->message = 'Id elemento non trovato';
$this->sendResponse();
}
$dati = $this->preUpdateElement($dati, $this->_getParam('id'));
$this->updateSingleElement($this->_getParam('id'), $dati);
$dati['id'] = $this->_getParam('id');
$dati = $this->afterUpdateElement($dati);
$this->_responseData->data = array('data' => $dati);
$this->_status = true;
$this->sendResponse();
} catch (Exception $e) {
$this->_responseData->message = $e->getMessage();
$this->sendResponse();
}
}
public function patchAction()
{
try {
$params = Zend_Json::decode($this->getRequest()->getRawBody());
// Zend_Registry::get('log')->info(print_r($params,true));
$form = $this->getAddFormForResource();
//Aggiornamento singolo
if (!$form->isValidPartial($params)) {
$this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_FORM_DATAINVALID;
$this->_responseData->message = 'I dati inseriti non sono validi';
$this->_responseData->errorDetails = $form->getMessages();
$this->sendResponse();
}
$dati = $form->getValues();
//rimuovo i valori vuoti che non devono essere sovrascritti
foreach ($dati as $key => $val){
if(!$val) unset($dati[$key]);
}
$id = $this->_getParam('id');
if (!$id) {
$this->_responseData->message = 'Id elemento non trovato';
$this->sendResponse();
}
// Zend_Registry::get('log')->info(print_r($dati,true));
$oldElement = (array) $this->_mongoModel->getById($this->_resourceName, $id);
$dati = array_merge($oldElement, $dati);
// Zend_Registry::get('log')->info(print_r($oldElement,true));
$dati = $this->preUpdateElement($dati, $id);
// Zend_Registry::get('log')->info(print_r($dati,true));
$this->updateSingleElement($id, $dati);
$dati['id'] = $id;
$dati = $this->afterUpdateElement($dati);
$this->_responseData->data = array('data' => $dati);
$this->_status = true;
$this->sendResponse();
} catch (Exception $e) {
$this->_responseData->message = $e->getMessage();
$this->sendResponse();
}
}
public function deleteAction()
{
try {
if (!$this->_getParam('id')) {
$this->_status = false;
$this->_responseData->message = "Errore id non trovato";
$this->_responseData->errorCode = App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_NOIDERROR;
return $this->sendResponse();
}
//Eliminazione Singola
$this->deleteSingleElement($this->_getParam('id'));
$this->_status = true;
return $this->sendResponse();
} catch (Exception $e) {
$this->_responseData->message = $e->getMessage();
return $this->sendResponse();
}
}
public function headAction()
{
$this->_status = true;
$this->sendResponse();
}
public function optionsAction()
{
$this->_status = true;
$this->sendResponse();
}
//##################################### SINGLE ELEMENT FUNCTIONS ###################################################
public function getSingleElement($id)
{
return $this->getSingleElementManipulate($this->_mongoModel->getById($this->_resourceName, $id));
}
public function insertSingleElement($dati)
{
return $this->_mongoModel->insert($this->_resourceName, $dati);
}
public function updateSingleElement($id, $dati)
{
return $this->_mongoModel->update($this->_resourceName, $id, $dati);
}
public function deleteSingleElement($id)
{
return $this->_mongoModel->delete($this->_resourceName, $id);
}
//##################################### HELPERS FUNCTIONS ###################################################
public function getSingleElementManipulate($data)
{
return $data;
}
public function preInsertElement($data)
{
return $data;
}
public function afterInsertElement($data)
{
return $data;
}
public function preUpdateElement($data, $id)
{
return $data;
}
public function afterUpdateElement($data)
{
return $data;
}
public function handleGetListFilters($where){
return $where;
}
//##################################### GENERIC FUNCTIONS ##########################################################
public function sendResponse()
{
if (!$this->_status) {
$message = (!$this->_responseData->message) ? "Errore non identificato sul web service risorsa: '$this->_resourceName'" : $this->_responseData->message;
$errorCode = (!$this->_responseData->errorCode) ? App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR : $this->_responseData->errorCode;
$this->sendErrorResponse($message, $errorCode);
}
if (isset($this->_responseData->data) && is_array($this->_responseData->data)) {
$this->_responseData->totalItems = $this->_mongoModel->getCountTotal($this->_resourceName);
if (Zend_Registry::isRegistered(App_Model_Mongo_Client::WHERE_MONGO_REG_NAME)) {
$this->_responseData->currentItemsCount = $this->_mongoModel->getCountFilteredTotal($this->_resourceName, Zend_Registry::get(App_Model_Mongo_Client::WHERE_MONGO_REG_NAME));
} else {
$this->_responseData->currentItemsCount = $this->_responseData->totalItems;
}
}
if ($this->_inArray) {
$content = $this->_responseData->data;
$this->getResponse()
->setHeader('X-Page', $this->getParam('page'))
->setHeader('X-Count', $this->getParam('count'))
->setHeader('X-Tot-Filtered', $this->_responseData->currentItemsCount)
->setHeader('X-Tot-Items', $this->_responseData->totalItems);
} else {
$content = ($this->_responseData->data);
}
$this->getResponse()
->setHeader('Content-Type', 'application/json;charset=utf-8')
->setBody($this->_helper->Globalfunction->safeJsonEncode($content))
->sendResponse();
exit;
}
public function sendErrorResponse($message, $errorCode, $dbName = null)
{
$message = (!$message) ? "Errore non identificato sul web service risorsa: '$this->_resourceName'" : $message;
$errorCode = (!$errorCode) ? App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_ERROR : $errorCode;
throw new App_Controller_Errors_WebServiceError(utf8_encode($message), $dbName, $errorCode);
}
public function disableCallAction()
{
// Disabilito la risorsa
$this->sendErrorResponse("Funzione non disponibile", App_Controller_Errors_WebServiceError::WEBSERVICE_GENERIC_NOPERMISSION);
}
protected function getAddFormForResource()
{
$class = implode('_', array(
'Application_Form',
strtoupper($this->getRequest()->getModuleName()),
ucfirst($this->_resourceName),
'Add'));
if (!class_exists($class)) {
throw new App_Controller_Errors_WebServiceError("Classe '$class' potrebbe non esistere");
}
return new $class();
}
}