= e(trans('backend::lang.form.return_to_list')) ?>
+ + + \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/index.htm b/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/index.htm new file mode 100644 index 000000000..ea43a3636 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/index.htm @@ -0,0 +1 @@ += $this->listRender() ?> diff --git a/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/preview.htm b/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/preview.htm new file mode 100644 index 000000000..f259af345 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/preview.htm @@ -0,0 +1,22 @@ + ++ + = e(trans('backend::lang.form.return_to_list')) ?> + +
\ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/reorder.htm b/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/reorder.htm new file mode 100644 index 000000000..9813ab46a --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/controllers/apigeneratorcontroller/reorder.htm @@ -0,0 +1,8 @@ + += e(trans('backend::lang.form.return_to_list')) ?>
+ + + + + + + + \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/helpers/Helpers.php b/plugins/ahmadfatoni/apigenerator/helpers/Helpers.php new file mode 100644 index 000000000..1145f7f7a --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/helpers/Helpers.php @@ -0,0 +1,19 @@ + (isset($statusCode)) ? $statusCode : 500, + 'message' => (isset($message)) ? $message : 'error' + ]; + if (count($data) > 0) { + $arr['data'] = $data; + } + + return response()->json($arr, $arr['status_code']); + //return $arr; + + } +} \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/lang/en/lang.php b/plugins/ahmadfatoni/apigenerator/lang/en/lang.php new file mode 100644 index 000000000..9ade59ec2 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/lang/en/lang.php @@ -0,0 +1,6 @@ + [ + 'name' => 'API-Generator', + 'description' => 'Generate API base on Builder Plugin' + ] +]; \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/models/ApiGenerator.php b/plugins/ahmadfatoni/apigenerator/models/ApiGenerator.php new file mode 100644 index 000000000..531bfd111 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/models/ApiGenerator.php @@ -0,0 +1,76 @@ + 'required|unique:ahmadfatoni_apigenerator_data,name|regex:/^[\pL\s\-]+$/u', + 'endpoint' => 'required|unique:ahmadfatoni_apigenerator_data,endpoint', + 'custom_format' => 'json' + ]; + + public $customMessages = [ + 'custom_format.json' => 'Invalid Json Format Custom Condition' + ]; + + /* + * Disable timestamps by default. + * Remove this line if timestamps are defined in the database table. + */ + public $timestamps = false; + + /** + * @var string The database table used by the model. + */ + public $table = 'ahmadfatoni_apigenerator_data'; + + /** + * get model List + * @return [type] [description] + */ + public function getModelOptions(){ + + return ComponentHelper::instance()->listGlobalModels(); + } + + /** + * [setCustomFormatAttribute description] + * @param [type] $value [description] + */ + public function setCustomFormatAttribute($value){ + + $json = str_replace('\t', '', $value); + $json = json_decode($json); + + if( $json != null){ + + if( ! isset($json->fillable) AND ! isset($json->relation) ){ + + return $this->attributes['custom_format'] = 'invalid format'; + + } + + if( isset($json->relation) AND $json->relation != null ){ + foreach ($json->relation as $key) { + if( !isset($key->name) OR $key->name == null ){ + return $this->attributes['custom_format'] = 'invalid format'; + } + } + } + } + + return $this->attributes['custom_format'] = $value; + + } + +} \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/models/apigenerator/columns.yaml b/plugins/ahmadfatoni/apigenerator/models/apigenerator/columns.yaml new file mode 100644 index 000000000..58ce8eb61 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/models/apigenerator/columns.yaml @@ -0,0 +1,9 @@ +columns: + name: + label: 'API NAME' + type: text + searchable: true + sortable: true + endpoint: + label: 'BASE ENDPOINT' + type: text diff --git a/plugins/ahmadfatoni/apigenerator/models/apigenerator/fields.yaml b/plugins/ahmadfatoni/apigenerator/models/apigenerator/fields.yaml new file mode 100644 index 000000000..a8e6e0bce --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/models/apigenerator/fields.yaml @@ -0,0 +1,33 @@ +fields: + name: + label: 'API Name' + oc.commentPosition: '' + span: auto + placeholder: 'Name of your API' + required: 1 + type: text + endpoint: + label: 'Base Endpoint' + oc.commentPosition: '' + span: auto + placeholder: api/v1/modulename + required: 1 + type: text + description: + label: 'Short Description' + oc.commentPosition: '' + span: auto + placeholder: 'Descript your API' + type: text + model: + label: 'Select Model' + oc.commentPosition: '' + span: auto + required: 1 + type: dropdown + custom_format: + label: 'Custom Condition (Fillable and Relation)' + size: large + oc.commentPosition: '' + span: full + type: textarea diff --git a/plugins/ahmadfatoni/apigenerator/plugin.yaml b/plugins/ahmadfatoni/apigenerator/plugin.yaml new file mode 100644 index 000000000..598021df5 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/plugin.yaml @@ -0,0 +1,17 @@ +plugin: + name: 'ahmadfatoni.apigenerator::lang.plugin.name' + description: 'ahmadfatoni.apigenerator::lang.plugin.description' + author: AhmadFatoni + icon: oc-icon-bolt + homepage: '' +navigation: + api-generator: + label: 'API Generator' + url: ahmadfatoni/apigenerator/apigeneratorcontroller + icon: icon-cogs + permissions: + - ahmadfatoni.apigenerator.manage +permissions: + ahmadfatoni.apigenerator.manage: + tab: 'API Generator' + label: 'Manage the API Generator' diff --git a/plugins/ahmadfatoni/apigenerator/routes.php b/plugins/ahmadfatoni/apigenerator/routes.php new file mode 100644 index 000000000..bdc1b2a41 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/routes.php @@ -0,0 +1,10 @@ + 'fatoni.generate.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@generateApi')); +Route::post('fatoni/update/api/{id}', array('as' => 'fatoni.update.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@updateApi')); +Route::get('fatoni/delete/api/{id}', array('as' => 'fatoni.delete.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@deleteApi')); + +Route::resource('api/v1/categories', 'AhmadFatoni\ApiGenerator\Controllers\API\CategoriesController', ['except' => ['destroy', 'create', 'edit']]); +Route::get('api/v1/categories/{id}/delete', ['as' => 'api/v1/categories.delete', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\API\CategoriesController@destroy']); +Route::resource('api/v1/posts', 'AhmadFatoni\ApiGenerator\Controllers\API\postsController', ['except' => ['destroy', 'create', 'edit']]); +Route::get('api/v1/posts/{id}/delete', ['as' => 'api/v1/posts.delete', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\API\postsController@destroy']); \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/template/controller.dot b/plugins/ahmadfatoni/apigenerator/template/controller.dot new file mode 100644 index 000000000..ff20ea3aa --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/template/controller.dot @@ -0,0 +1,99 @@ +{{modelname}} = ${{modelname}}; + $this->helpers = $helpers; + } + + public function index(){ + + $data = $this->{{modelname}}->all()->toArray(); + + return $this->helpers->apiArrayResponseBuilder(200, 'success', $data); + } + + public function show($id){ + + $data = $this->{{modelname}}::find($id); + + if ($data){ + return $this->helpers->apiArrayResponseBuilder(200, 'success', [$data]); + } else { + $this->helpers->apiArrayResponseBuilder(404, 'not found', ['error' => 'Resource id=' . $id . ' could not be found']); + } + + } + + public function store(Request $request){ + + $arr = $request->all(); + + while ( $data = current($arr)) { + $this->{{modelname}}->{key($arr)} = $data; + next($arr); + } + + $validation = Validator::make($request->all(), $this->{{modelname}}->rules); + + if( $validation->passes() ){ + $this->{{modelname}}->save(); + return $this->helpers->apiArrayResponseBuilder(201, 'created', ['id' => $this->{{modelname}}->id]); + }else{ + return $this->helpers->apiArrayResponseBuilder(400, 'fail', $validation->errors() ); + } + + } + + public function update($id, Request $request){ + + $status = $this->{{modelname}}->where('id',$id)->update($data); + + if( $status ){ + + return $this->helpers->apiArrayResponseBuilder(200, 'success', 'Data has been updated successfully.'); + + }else{ + + return $this->helpers->apiArrayResponseBuilder(400, 'bad request', 'Error, data failed to update.'); + + } + } + + public function delete($id){ + + $this->{{modelname}}->where('id',$id)->delete(); + + return $this->helpers->apiArrayResponseBuilder(200, 'success', 'Data has been deleted successfully.'); + } + + public function destroy($id){ + + $this->{{modelname}}->where('id',$id)->delete(); + + return $this->helpers->apiArrayResponseBuilder(200, 'success', 'Data has been deleted successfully.'); + } + + + 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); + } + +} \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/template/controller.php b/plugins/ahmadfatoni/apigenerator/template/controller.php new file mode 100644 index 000000000..f78dde065 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/template/controller.php @@ -0,0 +1,35 @@ +{{modelname}} = ${{modelname}}; + } + + 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); + } + + // public function create(Request $request){ + + // $arr = $request->all(); + + // while ( $data = current($arr)) { + // $this-> + // } + // return json_encode($this->{{modelname}}->store($request)); + + // } +} diff --git a/plugins/ahmadfatoni/apigenerator/template/customcontroller.dot b/plugins/ahmadfatoni/apigenerator/template/customcontroller.dot new file mode 100644 index 000000000..be5cf6ff2 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/template/customcontroller.dot @@ -0,0 +1,83 @@ +{{modelname}} = ${{modelname}}; + $this->helpers = $helpers; + } + + {{select}} + + {{show}} + + public function store(Request $request){ + + $arr = $request->all(); + + while ( $data = current($arr)) { + $this->{{modelname}}->{key($arr)} = $data; + next($arr); + } + + $validation = Validator::make($request->all(), $this->{{modelname}}->rules); + + if( $validation->passes() ){ + $this->{{modelname}}->save(); + return $this->helpers->apiArrayResponseBuilder(201, 'created', ['id' => $this->{{modelname}}->id]); + }else{ + return $this->helpers->apiArrayResponseBuilder(400, 'fail', $validation->errors() ); + } + + } + + public function update($id, Request $request){ + + $status = $this->{{modelname}}->where('id',$id)->update($data); + + if( $status ){ + + return $this->helpers->apiArrayResponseBuilder(200, 'success', 'Data has been updated successfully.'); + + }else{ + + return $this->helpers->apiArrayResponseBuilder(400, 'bad request', 'Error, data failed to update.'); + + } + } + + public function delete($id){ + + $this->{{modelname}}->where('id',$id)->delete(); + + return $this->helpers->apiArrayResponseBuilder(200, 'success', 'Data has been deleted successfully.'); + } + + public function destroy($id){ + + $this->{{modelname}}->where('id',$id)->delete(); + + return $this->helpers->apiArrayResponseBuilder(200, 'success', 'Data has been deleted successfully.'); + } + + + 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); + } + +} diff --git a/plugins/ahmadfatoni/apigenerator/template/route.dot b/plugins/ahmadfatoni/apigenerator/template/route.dot new file mode 100644 index 000000000..515cb53c9 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/template/route.dot @@ -0,0 +1,3 @@ + +Route::resource('{{modelname}}', 'AhmadFatoni\ApiGenerator\Controllers\API\{{controllername}}Controller', ['except' => ['destroy', 'create', 'edit']]); +Route::get('{{modelname}}/{id}/delete', ['as' => '{{modelname}}.delete', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\API\{{controllername}}Controller@destroy']); \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/template/routes.dot b/plugins/ahmadfatoni/apigenerator/template/routes.dot new file mode 100644 index 000000000..ddafe5901 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/template/routes.dot @@ -0,0 +1,6 @@ + 'fatoni.generate.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@generateApi')); +Route::post('fatoni/update/api/{id}', array('as' => 'fatoni.update.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@updateApi')); +Route::get('fatoni/delete/api/{id}', array('as' => 'fatoni.delete.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@deleteApi')); +{{route}} \ No newline at end of file diff --git a/plugins/ahmadfatoni/apigenerator/updates/builder_table_create_ahmadfatoni_apigenerator_data.php b/plugins/ahmadfatoni/apigenerator/updates/builder_table_create_ahmadfatoni_apigenerator_data.php new file mode 100644 index 000000000..44cdc81e3 --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/updates/builder_table_create_ahmadfatoni_apigenerator_data.php @@ -0,0 +1,26 @@ +engine = 'InnoDB'; + $table->increments('id'); + $table->string('name'); + $table->string('endpoint'); + $table->string('model'); + $table->string('description')->nullable(); + $table->text('custom_format')->nullable(); + }); + } + + public function down() + { + Schema::dropIfExists('ahmadfatoni_apigenerator_data'); + } +} diff --git a/plugins/ahmadfatoni/apigenerator/updates/version.yaml b/plugins/ahmadfatoni/apigenerator/updates/version.yaml new file mode 100644 index 000000000..966ff307a --- /dev/null +++ b/plugins/ahmadfatoni/apigenerator/updates/version.yaml @@ -0,0 +1,15 @@ +1.0.1: + - 'Initialize plugin.' +1.0.2: + - 'Database implementation' +1.0.3: + - 'add builder plugin on requirements dependency' + - builder_table_create_ahmadfatoni_apigenerator_data.php +1.0.4: + - 'fixing bug on PHP 7' +1.0.5: + - 'fixing bug on request delete data' +1.0.6: + - 'fixing bug on generate endpoint' +1.0.7: + - 'fixing bug on October CMS v1.0.456' \ No newline at end of file diff --git a/plugins/vdlp/rssfetcher/components/Items.php b/plugins/vdlp/rssfetcher/components/Items.php index 9cb326ef7..c983e74a0 100644 --- a/plugins/vdlp/rssfetcher/components/Items.php +++ b/plugins/vdlp/rssfetcher/components/Items.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace Vdlp\RssFetcher\Components; use Cms\Classes\ComponentBase; +use Illuminate\Support\Facades\App; use October\Rain\Support\Collection; use Throwable; use Vdlp\RssFetcher\Models\Item; @@ -80,6 +81,7 @@ class Items extends ComponentBase 'vdlp_rssfetcher_sources.id' ) ->where('vdlp_rssfetcher_sources.is_enabled', '=', 1) + ->where('vdlp_rssfetcher_sources.locale', '=', App::getLocale()) ->where('vdlp_rssfetcher_items.is_published', '=', 1) ->orderBy('vdlp_rssfetcher_items.pub_date', 'desc') ->limit($maxItems); diff --git a/plugins/vdlp/rssfetcher/models/source/columns.yaml b/plugins/vdlp/rssfetcher/models/source/columns.yaml index 1383c5e30..732a77354 100644 --- a/plugins/vdlp/rssfetcher/models/source/columns.yaml +++ b/plugins/vdlp/rssfetcher/models/source/columns.yaml @@ -19,3 +19,5 @@ columns: fetched_at: label: vdlp.rssfetcher::lang.source.last_fetched type: timesince + locale: + label: language diff --git a/plugins/vdlp/rssfetcher/models/source/fields.yaml b/plugins/vdlp/rssfetcher/models/source/fields.yaml index b8ee1e455..45cdbe267 100644 --- a/plugins/vdlp/rssfetcher/models/source/fields.yaml +++ b/plugins/vdlp/rssfetcher/models/source/fields.yaml @@ -28,3 +28,11 @@ fields: label: vdlp.rssfetcher::lang.source.publish_new_items type: switch span: left + locale: + label: Language of Source + span: left + type: dropdown + default: ru + options: + ru: Russian + en: English diff --git a/plugins/vdlp/rssfetcher/updates/version.yaml b/plugins/vdlp/rssfetcher/updates/version.yaml index b824d3dce..9c65539d4 100644 --- a/plugins/vdlp/rssfetcher/updates/version.yaml +++ b/plugins/vdlp/rssfetcher/updates/version.yaml @@ -1,20 +1,23 @@ 1.0.0: - - "First version of RssFetcher" + - 'First version of RssFetcher' - 20180718_0001_create_sources_table.php - 20180718_0002_create_items_table.php - 20180718_0003_seed_feeds_table.php - 20180718_0004_seed_sources_table.php -1.0.1: "Add correct controller permissions" +1.0.1: 'Add correct controller permissions' 1.0.2: - - "Move publish_new_items to Sources table" + - 'Move publish_new_items to Sources table' - 20181012_0005_move_publish_new_items_to_sources_table.php -1.0.3: "Fix SQL error with `enclosure_length` attribute" -1.0.4: "Code optimizations" -1.0.5: "Escape output to prevent XSS injections" -1.1.0: "Code improvements (>= PHP 7.1)" +1.0.3: 'Fix SQL error with `enclosure_length` attribute' +1.0.4: 'Code optimizations' +1.0.5: 'Escape output to prevent XSS injections' +1.1.0: 'Code improvements (>= PHP 7.1)' 1.2.0: - - "Improve item saving" + - 'Improve item saving' - 20200206_0006_remove_unique_constraint_from_items.php 2.0.0: - - "Replace Zend Framework with Laminas and added events" -2.1.0: "Fix Author parsing for Atom/RSS feeds" + - 'Replace Zend Framework with Laminas and added events' +2.1.0: 'Fix Author parsing for Atom/RSS feeds' +2.1.1: + - 'Updated table vdlp_rssfetcher_sources' + - builder_table_update_vdlp_rssfetcher_sources.php diff --git a/themes/modern/content/static-pages-en/contact.htm b/themes/modern/content/static-pages-en/contact.htm index eccd4e2d6..989c7d5df 100644 --- a/themes/modern/content/static-pages-en/contact.htm +++ b/themes/modern/content/static-pages-en/contact.htm @@ -1,3 +1,14 @@ [viewBag] title = "Contact us" -== \ No newline at end of file +== +{% put form %} +