Begin REST API implementation with thirdparty classes and methods needed.
Work in progress !
This commit is contained in:
parent
b503b16f07
commit
30c901c266
90
htdocs/api/class/api.class.php
Normal file
90
htdocs/api/class/api.class.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
/* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Luracast\Restler\Restler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for API
|
||||||
|
*/
|
||||||
|
class DolibarrApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var DoliDb $db Database object
|
||||||
|
*/
|
||||||
|
static protected $db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Restler $r Restler object
|
||||||
|
*/
|
||||||
|
var $r;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @var DoliDB $db Database handler
|
||||||
|
*/
|
||||||
|
function __construct($db) {
|
||||||
|
$this->db = $db;
|
||||||
|
$this->r = new Restler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executed method when API is called without parameter
|
||||||
|
*
|
||||||
|
* Display a short message an return a http code 200
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function index()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'success' => array(
|
||||||
|
'code' => 200,
|
||||||
|
'message' => __class__.' is up and running!'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean sensible object datas
|
||||||
|
* @var object $object Object to clean
|
||||||
|
* @return array Array of cleaned object properties
|
||||||
|
*
|
||||||
|
* @todo use an array for properties to clean
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected function cleanObjectDatas($object){
|
||||||
|
|
||||||
|
unset($object->db);
|
||||||
|
|
||||||
|
return array($object);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API init
|
||||||
|
* This class exists to show 200 code when request url root /api/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class DolibarrApiInit extends DolibarrApi {
|
||||||
|
|
||||||
|
function __construct() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
8
htdocs/api/index.php
Normal file
8
htdocs/api/index.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
95
htdocs/public/api/index.php
Normal file
95
htdocs/public/api/index.php
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
/* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup api Module DolibarrApi
|
||||||
|
* \brief API loader
|
||||||
|
* Search files htdocs/<module>/class/api_<module>.class.php
|
||||||
|
* \file htdocs/api/indexphp
|
||||||
|
*
|
||||||
|
* @todo User authentication with api_key
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
if (! defined("NOLOGIN")) define("NOLOGIN",'1');
|
||||||
|
|
||||||
|
$res=0;
|
||||||
|
if (! $res && file_exists("../../main.inc.php")) $res=@include '../../main.inc.php';
|
||||||
|
if (! $res && file_exists("../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../dolibarr/htdocs/main.inc.php'; // For custom directory
|
||||||
|
if (! $res) die("Include of main fails");
|
||||||
|
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/includes/restler/vendor/autoload.php';
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/api/class/api.class.php';
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
||||||
|
|
||||||
|
$api = new DolibarrApi($db);
|
||||||
|
|
||||||
|
$api->r->setSupportedFormats('JsonFormat', 'XmlFormat');
|
||||||
|
$api->r->addAPIClass('Luracast\\Restler\\Resources'); //this creates resources.json at API Root
|
||||||
|
$api->r->addAPIClass('DolibarrApiInit',''); // Just for url root page
|
||||||
|
|
||||||
|
$modulesdir = dolGetModulesDirs();
|
||||||
|
foreach ($modulesdir as $dir)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Search available module
|
||||||
|
*/
|
||||||
|
dol_syslog("Scan directory ".$dir." for API modules");
|
||||||
|
|
||||||
|
$handle=@opendir(dol_osencode($dir));
|
||||||
|
if (is_resource($handle))
|
||||||
|
{
|
||||||
|
while (($file = readdir($handle))!==false)
|
||||||
|
{
|
||||||
|
if (is_readable($dir.$file) && preg_match("/^(mod.*)\.class\.php$/i",$file,$reg))
|
||||||
|
{
|
||||||
|
$modulename=$reg[1];
|
||||||
|
|
||||||
|
// Defined if module is enabled
|
||||||
|
$enabled=true;
|
||||||
|
$part=$obj=strtolower(preg_replace('/^mod/i','',$modulename));
|
||||||
|
//if ($part == 'propale') $part='propal';
|
||||||
|
if ($part == 'societe') {
|
||||||
|
$obj = 'thirdparty';
|
||||||
|
}
|
||||||
|
if (empty($conf->$part->enabled)) $enabled=false;
|
||||||
|
|
||||||
|
if ($enabled)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* If exists, load the API class for enable module
|
||||||
|
*
|
||||||
|
* Search a file api_<object>.class.php into /htdocs/<module>/class directory
|
||||||
|
*
|
||||||
|
* @todo : take care of externals module!
|
||||||
|
* @todo : use getElementProperties() function
|
||||||
|
*/
|
||||||
|
$file = DOL_DOCUMENT_ROOT.'/'.$part."/class/api_".$obj.".class.php";
|
||||||
|
|
||||||
|
$classname = ucwords($obj).'Api';
|
||||||
|
if (file_exists($file))
|
||||||
|
{
|
||||||
|
require_once $file;
|
||||||
|
$api->r->addAPIClass($classname,'');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$api->r->handle(); //serve the response
|
||||||
143
htdocs/societe/class/api_thirdparty.class.php
Normal file
143
htdocs/societe/class/api_thirdparty.class.php
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
<?php
|
||||||
|
/* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Luracast\Restler\RestException;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* API class for thirdparty object
|
||||||
|
*
|
||||||
|
* @smart-auto-routing false
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class ThirdpartyApi extends DolibarrApi {
|
||||||
|
|
||||||
|
static $FIELDS = array(
|
||||||
|
'name',
|
||||||
|
'email'
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Societe $company {@type Societe}
|
||||||
|
*/
|
||||||
|
public $company;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @url thirdparty/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
global $db;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->company = new Societe($this->db);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get properties of a thirdparty object
|
||||||
|
*
|
||||||
|
* Return an array with thirdparty informations
|
||||||
|
*
|
||||||
|
* @url GET thirdparty/{id}
|
||||||
|
* @param int $id ID of thirdparty
|
||||||
|
* @return array|mixed data without useless information
|
||||||
|
* @throws RestException
|
||||||
|
*/
|
||||||
|
function get($id)
|
||||||
|
{
|
||||||
|
$result = $this->company->fetch($id);
|
||||||
|
if( ! $result ) {
|
||||||
|
throw new RestException(404, 'Thirdparty not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->cleanObjectDatas($this->company);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a list of thirdparties
|
||||||
|
*
|
||||||
|
* @url GET /thirdparties/list
|
||||||
|
*
|
||||||
|
* @return array Array of thirdparty objects
|
||||||
|
*/
|
||||||
|
function getList() {
|
||||||
|
|
||||||
|
$result = $this->company->fetch_all($id);
|
||||||
|
if( ! $result ) {
|
||||||
|
throw new RestException(404, 'Thirdparties not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->cleanObjectDatas($this->company->lines);
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Create thirdparty object
|
||||||
|
*
|
||||||
|
* @url POST thirdparty/
|
||||||
|
* @param type $request_data
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
function post($request_data = NULL)
|
||||||
|
{
|
||||||
|
return $this->company->create($this->_validate($request_data));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update thirdparty
|
||||||
|
*
|
||||||
|
* @url PUT thirdparty/{id}
|
||||||
|
* @param type $id
|
||||||
|
* @param type $request_data
|
||||||
|
* @return type$this->company
|
||||||
|
*/
|
||||||
|
function put($id, $request_data = NULL)
|
||||||
|
{
|
||||||
|
return $this->company->update($id, $this->_validate($request_data));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete thirdparty
|
||||||
|
*
|
||||||
|
* @url DELETE thirdparty/{id}
|
||||||
|
* @param type $id
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
function delete($id)
|
||||||
|
{
|
||||||
|
return $this->company->delete($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate fields before create or update object
|
||||||
|
* @param type $data
|
||||||
|
* @return array
|
||||||
|
* @throws RestException
|
||||||
|
*/
|
||||||
|
private function _validate($data)
|
||||||
|
{
|
||||||
|
$thirdparty = array();
|
||||||
|
foreach (ThirdpartyApi::$FIELDS as $field) {
|
||||||
|
if (!isset($data[$field]))
|
||||||
|
throw new RestException(400, "$field field missing");
|
||||||
|
$thirdparty[$field] = $data[$field];
|
||||||
|
}
|
||||||
|
return $thirdparty;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user