Files
FHC-Core/public/js/RESTClient.js
2024-10-17 15:34:00 +02:00

230 lines
6.3 KiB
JavaScript

/**
* Copyright (C) 2022 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
//--------------------------------------------------------------------------------------------------------------------
// Configs
// To see debug messages into the browser console set this parameter as true
const CORE_REST_CLIENT_DEBUG = false;
// Default timeout (milliseconds)
const CORE_REST_CLIENT_TIMEOUT = 5000;
//--------------------------------------------------------------------------------------------------------------------
// Constants
// Success
const CORE_REST_CLIENT_SUCCESS = 0;
// Properties present in a response
const CORE_REST_CLIENT_ERROR = "error";
const CORE_REST_CLIENT_RETVAL = "retval";
// HTTP method parameters
const CRC_HTTP_GET_METHOD = "get";
const CRC_HTTP_POST_METHOD = "post";
/**
* Definition and initialization of the object CoreRESTClient
*/
export const CoreRESTClient = {
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Performs a call using the HTTP GET method
* wsParameters is an object
* axiosParameters is an object
*/
get: function(wsURL, wsParameters, axiosParameters = null) {
return CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_GET_METHOD, axiosParameters);
},
/**
* Performs a call using the HTTP POST method
* wsParameters is an object
* axiosParameters is an object
*/
post: function(wsURL, wsParameters, axiosParameters = null) {
return CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_POST_METHOD, axiosParameters);
},
/**
* Checks if the response is a success
*/
isSuccess: function(response) {
if (typeof response === "object" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR)
&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL) && response.error == CORE_REST_CLIENT_SUCCESS)
{
return true;
}
return false;
},
/**
* Checks if the response is an error
*/
isError: function(response) {
return !CoreRESTClient.isSuccess(response);
},
/**
* Checks if the response has data
*/
hasData: function(response) {
if (CoreRESTClient.isSuccess(response))
{
if ((typeof response[CORE_REST_CLIENT_RETVAL] === "object" && Object.keys(response[CORE_REST_CLIENT_RETVAL]).length > 0)
|| (typeof response[CORE_REST_CLIENT_RETVAL] === "array" && response[CORE_REST_CLIENT_RETVAL].length > 0)
|| (typeof response[CORE_REST_CLIENT_RETVAL] === "string" && response[CORE_REST_CLIENT_RETVAL].trim() != "")
|| typeof response[CORE_REST_CLIENT_RETVAL] === "number")
{
return true;
}
}
return false;
},
/**
* Retrives data from response object
*/
getData: function(response) {
if (CoreRESTClient.hasData(response))
{
return response[CORE_REST_CLIENT_RETVAL];
}
return null;
},
/**
* Retrives error message from response object
*/
getError: function(response) {
if (typeof response === "object"
&& Object.keys(response).length > 0
&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL))
{
return response[CORE_REST_CLIENT_RETVAL];
}
return "Generic error";
},
/**
* Retrives code from response object
*/
getErrorCode: function(response) {
if (typeof response === "object" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR))
{
return response[CORE_REST_CLIENT_ERROR];
}
return 1; // Generic error
},
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Generate the router URI using the connection parameters
*/
_generateRouterURI: function(wsURL) {
var uri = null;
// Checks if global JS object FHC_JS_DATA_STORAGE_OBJECT exists
if (typeof FHC_JS_DATA_STORAGE_OBJECT !== "undefined")
{
uri = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/" + wsURL;
}
return uri;
},
/**
* Method to print debug info after a controller has been called
*/
_printDebug: function(parameters, response, errorThrown) {
if (CORE_REST_CLIENT_DEBUG === true) // If global const CORE_REST_CLIENT_DEBUG is true, but really true!
{
// Print info about called controller
console.log("Called controller: " + parameters.remoteController);
console.log("Call parameters:"); // parameters given to this call
console.log(parameters);
if (response != null) // if there is a response...
{
console.log("Controller Response:");
console.log(response); // ...print it
}
if (errorThrown != null) // if there is a jQuery error...
{
console.log("jQuery error:");
console.log(errorThrown); // ...print it
}
console.log("--------------------------------------------------------------------------------------------");
}
},
/**
* Performs a call to the server were the CI PHP layer is running
* - wsURL: alias of the core controller to call
* - wsParameters: parameters to give to the called controller
* - type: POST or GET HTTP method
* - axiosParameters: an object to configure the axios call
*/
_axiosCall: function(wsURL, wsParameters, type, axiosParameters) {
// Axios config object
let axiosCallObj = {
method: type,
url: CoreRESTClient._generateRouterURI(wsURL),
timeout: CORE_REST_CLIENT_TIMEOUT // default time out
};
// The ajax call is HTTP GET
if (type == CRC_HTTP_GET_METHOD)
{
axiosCallObj.params = wsParameters;
}
// The ajax call is HTTP POST
else
{
axiosCallObj.data = wsParameters;
}
// Check if axiosParameters is an object
if (typeof axiosParameters === "object")
{
// And then copies the its properties into axiosCallObj
for (var prop in axiosParameters) axiosCallObj[prop] = axiosParameters[prop];
}
// Perform the ajax call via axios
return axios(axiosCallObj);
}
};