/plugins/ahmadfatoni/apigenerator/controllers/ApiGeneratorController.php
PHP | 336 lines | 210 code | 92 blank | 34 comment | 34 complexity | 2d6556bf381c79b1ab34f87f597ab395 MD5 | raw file
Possible License(s): GPL-2.0, MIT
- <?php namespace AhmadFatoni\ApiGenerator\Controllers;
- use Backend\Classes\Controller;
- use AhmadFatoni\ApiGenerator\Models\ApiGenerator;
- use BackendMenu;
- use Backend;
- use Illuminate\Http\Request;
- use Illuminate\Filesystem\Filesystem;
- use Redirect;
- use Flash;
- class ApiGeneratorController extends Controller
- {
- public $implement = ['Backend\Behaviors\ListController','Backend\Behaviors\FormController','Backend\Behaviors\ReorderController'];
-
- public $listConfig = 'config_list.yaml';
- public $formConfig = 'config_form.yaml';
- public $reorderConfig = 'config_reorder.yaml';
- protected $path = "/api/";
- private $homePage = 'ahmadfatoni/apigenerator/apigeneratorcontroller';
- protected $files;
- public function __construct(Filesystem $files)
- {
- parent::__construct();
- BackendMenu::setContext('AhmadFatoni.ApiGenerator', 'api-generator');
- $this->files = $files;
- }
- /**
- * delete selected data (multiple delete)
- * @return [type] [description]
- */
- public function index_onDelete()
- {
- if (($checkedIds = post('checked')) && is_array($checkedIds) && count($checkedIds)) {
- foreach ($checkedIds as $id) {
- if ((!$item = ApiGenerator::find($id)))
- continue;
- $name = $item->name;
- if($item->delete()){
- $this->deleteApi($name);
- }
- }
- Flash::success('Successfully deleted those data.');
- }
- return $this->listRefresh();
- }
- /**
- * generate API
- * @param Request $request [description]
- * @return [type] [description]
- */
- public function generateApi(Request $request){
- $data['model'] = $request->model;
- $modelname = explode("\\", $request->model);
- $modelname = $modelname[count($modelname)-1];
- $data['modelname'] = $modelname;
- $data['controllername'] = str_replace(" ", "", $request->name);
- $data['endpoint'] = $request->endpoint;
- $data['custom_format'] = $request->custom_format;
- if( strpos($data['controllername'], ".") OR strpos($data['controllername'], "/") ){
- Flash::success('Failed to create data, invalid API name.');
- return Redirect::to( Backend::url($this->homePage));
-
- }
-
- if( isset($request->id) ){
- $this->deleteApi($request->oldname, 'false');
- }
- $this->files->put(__DIR__ . $this->path . $data['controllername'].'Controller.php', $this->compile($data));
- $this->files->put(__DIR__ . '/'.'../routes.php', $this->compileRoute($data));
- return Redirect::to( Backend::url($this->homePage));
- }
- /**
- * delete available API
- * @param [type] $name [description]
- * @param [type] $redirect [description]
- * @return [type] [description]
- */
- public function deleteApi($name, $redirect = null){
- $fileLocation = __DIR__ . $this->path.$name;
- $fileLocation = str_replace(".", "", $fileLocation);
- if( ! file_exists($fileLocation.'Controller.php') ){
- Flash::success('Failed to delete data, invalid file location.');
- return Redirect::to( Backend::url($this->homePage));
- }
- if( strpos( strtolower($name), 'apigenerator' ) === false){
- $data = [];
- //generate new route
- $this->files->put(__DIR__ . '/'.'../routes.php', $this->compileRoute($data));
-
- //remove controller
- if (file_exists( __DIR__ . $this->path.$name.'Controller.php' )) {
- unlink(__DIR__ . $this->path.$name.'Controller.php');
- }
- if( $redirect != null ){
- return 'success without redirect';
- }
- }
- return Redirect::to( Backend::url($this->homePage));
- }
- public function updateApi($name){
- }
- /**
- * compile controller from template
- * @param [type] $data [description]
- * @return [type] [description]
- */
- public function compile($data){
- if( $data['custom_format'] != ''){
- $template = $this->files->get(__DIR__ .'/../template/customcontroller.dot');
- $template = $this->replaceAttribute($template, $data);
- $template = $this->replaceCustomAttribute($template, $data);
- }else{
- $template = $this->files->get(__DIR__ .'/../template/controller.dot');
- $template = $this->replaceAttribute($template, $data);
- }
- return $template;
- }
- /**
- * replace attribute
- * @param [type] $template [description]
- * @param [type] $data [description]
- * @return [type] [description]
- */
- public function replaceAttribute($template, $data){
- if( isset( $data['model'] ) ){
- $template = str_replace('{{model}}', $data['model'], $template);
- }
- $template = str_replace('{{modelname}}', $data['modelname'], $template);
- $template = str_replace('{{controllername}}', $data['controllername'], $template);
- return $template;
- }
- /**
- * replace custom attribute
- * @param [type] $template [description]
- * @param [type] $data [description]
- * @return [type] [description]
- */
- public function replaceCustomAttribute($template, $data){
- $arr = str_replace('\t', '', $data['custom_format']);
- $arr = json_decode($arr);
- $select = str_replace('<br />', '', $this->compileOpenIndexFunction($data['modelname'], 'index'));
- $show = str_replace('<br />', '', $this->compileOpenIndexFunction($data['modelname'], 'show'));
- $fillableParent = '';
- if( isset($arr->fillable) AND $arr->fillable != null ) {
- $fillableParent = $this->compileFillableParent($arr->fillable);
- }
- if( isset($arr->relation) AND $arr->relation != null AND is_array($arr->relation) AND count($arr->relation) > 0) {
- $select .= str_replace('<br />', '', $this->compileFillableChild($arr->relation));
- $show .= str_replace('<br />', '', $this->compileFillableChild($arr->relation));
- }
-
- $select .= "->select(".$fillableParent.")";
- $show .= "->select(".$fillableParent.")->where('id', '=', \$id)->first();";
- ( $fillableParent != '') ? $select .= "->get()->toArray();" : $select .= "->toArray();" ;
- $closeFunction = str_replace('<br />', '', nl2br(
- "
- return \$this->helpers->apiArrayResponseBuilder(200, 'success', \$data);
- }"));
- $select .= $closeFunction;
- $show .= $closeFunction;
- $template = str_replace('{{select}}', $select, $template);
- $template = str_replace('{{show}}', $show, $template);
- return $template;
- }
- public function compileOpenIndexFunction($modelname, $type){
- if( $type == 'index'){
- return nl2br("
- public function index(){
- \$data = \$this->".$modelname);
- }else{
- return nl2br("
- public function show(\$id){
- \$data = \$this->".$modelname);
- }
- }
- public function compileFillableParent($fillable){
- $fillableParentArr = explode(",", $fillable);
- $fillableParent = '';
- foreach ($fillableParentArr as $key) {
- $fillableParent .= ",'".$key."'";
- }
- $fillableParent = substr_replace($fillableParent, '', 0 , 1);
- return $fillableParent;
- }
- public function compileFillableChild($fillable){
-
- $select = "->with(array(";
- foreach ($fillable as $key) {
-
- $fillableChild = "";
- if( isset($key->fillable) AND $key->fillable != null ){
- $fillableChildArr = explode(",", $key->fillable);
-
-
- foreach ($fillableChildArr as $key2) {
- $fillableChild .= ",'".$key2."'";
- }
- $fillableChild = substr_replace($fillableChild, '', 0 , 1);
- }
-
- $select .= nl2br(
- "
- '".$key->name."'=>function(\$query){
- \$query->select(".$fillableChild.");
- },");
- }
- $select .= " ))";
-
- return $select;
- }
- public function compileRoute($data){
- $oldData = ApiGenerator::all();
- $routeList = "";
- if( count($oldData) > 0 ){
- $routeList .= $this->parseRouteOldData($oldData, $data);
- }
- if( count($data) > 0 ){
- $data['modelname'] = $data['endpoint'];
- if( $data['modelname'][0] == "/" ){
- $data['modelname'] = substr_replace($data['modelname'], '', 0 , 1);
- }
- $routeList .= $this->parseRoute($data);
- }
- $route = $this->files->get(__DIR__ .'/../template/routes.dot');
- $route = str_replace('{{route}}', $routeList, $route);
- return $route;
- }
- public function parseRouteOldData($oldData, $data = null){
-
- $routeList = "";
- if( count($data) == 0 ) $data['modelname']='';
- foreach ( $oldData as $key ) {
- $modelname = explode("\\", $key->model);
- $modelname = $modelname[count($modelname)-1];
- $old['modelname'] = $key->name;
- $old['controllername'] = $key->name;
- if( $data['modelname'] != $modelname ){
- if( $old['modelname'][0] == "/" ){
- $old['modelname'] = substr_replace($old['modelname'], '', 0 , 1);
- }
- $routeList .= $this->parseRoute($old);
- }
- }
- return $routeList;
- }
- public function parseRoute($data){
- $template = $this->files->get(__DIR__ .'/../template/route.dot');
- $template = $this->replaceAttribute($template, $data);
- return $template;
- }
- public static function getAfterFilters() {return [];}
- public static function getBeforeFilters() {return [];}
- public static function getMiddleware() {return [];}
- public function callAction($method, $parameters=false) {
- return call_user_func_array(array($this, $method), $parameters);
- }
- }