daycry/restful

Rest Server for Codeigniter 4

v2.0.13 2023-11-23 15:03 UTC

README

Donate

Restful

Restful server for Codeigniter 4

Build Status Coverage Status Downloads GitHub release (latest by date) GitHub stars GitHub license

Installation via composer

Use the package with composer install

> composer require daycry/restful

Configuration

Run command:

> php spark restful:publish
> php spark settings:publish
> php spark cronjob:publish
> php spark jwt:publish

This command will copy a config file to your app namespace. Then you can adjust it to your needs. By default file will be present in app/Config/.

> php spark migrate -all

This command create restful tables in your database.

Usage

<?php namespace App\Controllers;

use CodeIgniter\RESTful\ResourceController;
use Daycry\RestFul\RestFul;
use Daycry\RestFul\Traits\Authenticable;

class Center extends ResourceController
{
    use RestFul;
    use Authenticable;

    public function index()
    {
        return $this->respond( $this->content );
    }
}


If you need to validate the data, you can call `validation` method passing the string rules, array of data and Validation Config file if you need.
By default load `App\Config\Validation.php` rules.

For Example: `app/Config/Validation.php` or if rules are in custom namespace `app/Modules/Example/Config/Validation.php`

```php
	public $requiredLogin = [
		'username'		=> 'required',
		'password'		=> 'required'
	];
<?php namespace App\Controllers;

use CodeIgniter\RESTful\ResourceController;
use Daycry\RestFul\RestFul;
use Daycry\RestFul\Traits\Authenticable;
use Daycry\RestFul\Traits\Validation;

class Center extends ResourceController
{
    use RestFul;
    use Authenticable;
    use Validation;

    public function index()
    {
        $this->validation( 'requiredLogin', $this->content );
        return $this->respond( $this->content );
    }
}

$this->content contains a body content in the request. $this->args contains all params, get, post, headers,...

If you want you can use the object $this->request for get this params if you want, for example, $this->request->getPost()

<?php namespace App\Controllers;

use CodeIgniter\RESTful\ResourceController;
use Daycry\RestFul\RestFul;
use Daycry\RestFul\Traits\Authenticable;
use Daycry\RestFul\Traits\Validation;

class Center extends ResourceController
{
    use RestFul;
    use Authenticable;
    use Validation;

    public function index()
    {
        $this->validation( 'requiredLogin', $this->content, config( Example\\Validation ), true, true );
        return $this->respond( $this->content );
    }
}

Validation function parameters

#Access Filter

You can restrict requests setting scopes by access filter

<?php

namespace App\Config;

$routes->group('group', ['namespace' => 'App\Controllers'], static function ($routes) {
    $routes->post('search/(:segment)', 'Search::$1', [ 'filter' => 'access:example.read' ]);
    $routes->post('auth/(:segment)', 'Auth::$1', [ 'filter' => 'access:example.auth' ]);
});

User Model Class

By default you can associate users with keys via the '\Daycry\RestFul\Models\UserModel' model, but you can customize extending this class.

Example:

<?php
namespace App\Models;

use CodeIgniter\Validation\ValidationInterface;
use CodeIgniter\Database\ConnectionInterface;
use Daycry\RestFul\Models\UserModel as RestFulUserModel

class UserModel extends RestFulUserModel
{
    protected $allowedFields  = [
        'username',
        'scopes'
    ];

    public function __construct(?ConnectionInterface &$db = null, ?ValidationInterface $validation = null)
    {
        parent::__construct($db, $validation);
    }

}

If you customize the user class, you have to modify the default configuration

Example:

<?php
    public string $userProvider = \Daycry\RestFul\Models\UserModel::class;

Exceptions & block Invalid Attempts

If you want to use some custom exception to use it as a failed request attempt and allow the blocking of that IP, you have to create the static attribute authorized.

If authorized is false the system increases by 1 the failed attempts by that IP. Example:

<?php

    namespace App\Exceptions;

    use Daycry\RestFul\Exceptions\RuntimeException;

    class CustomException extends RuntimeException
    {
        protected $code = 401;

        public static $authorized = true;

        public static function forInvalidPassphrase()
        {
            self::$authorized = false;
            return new self(lang('Secret.invalidPassphrase'));
        }

        public static function forInvalidToken()
        {
            self::$authorized = false;
            return new self(lang('Secret.invalidToken'));
        }

        public static function forExpiredToken()
        {
            self::$authorized = false;
            return new self(lang('Secret.tokenExpired'));
        }

        public static function forTokenReaded()
        {
            self::$authorized = false;
            return new self(lang('Secret.readed'));
        }
    }

OPTIONS

You can customize the requests independently using the ws_endpoints table.

You can fill the ws_controllers automatically with a command.

<?php

    php spark restful:discover

This command search class in the namespace o namespaces that you want. You can set this namespaces in the RestFul.php config file.

<?php

    /**
    *--------------------------------------------------------------------------
    * Cronjob
    *--------------------------------------------------------------------------
    *
    * Set to TRUE to enable Cronjob for fill the table petitions with your API classes
    * $restNamespaceScope \Namespace\Class or \Namespace\Folder\Class or \Namespace example: \App\Controllers
    *
    * This feature use Daycry\CronJob vendor
    * for more information: https://github.com/daycry/cronjob
    *
    */
    public array $namespaceScope = ['\App\Controllers', '\Api\Controllers'];

Or creating a cronjob tasks editing CronJob.php config file like this.

<?php

    /*
    |--------------------------------------------------------------------------
    | Cronjobs
    |--------------------------------------------------------------------------
    |
    | Register any tasks within this method for the application.
    | Called by the TaskRunner.
    |
    | @param Scheduler $schedule
    */
    public function init(Scheduler $schedule)
    {
        $schedule->command('restful:discover')->named('discoverRestful')->daily();
        or
        $schedule->command('restful:discover')->named('discoverRestful')->daily('11:30 am');
    }

More information about cronjob: https://github.com/daycry/cronjob

RESPONSE

The default response is in json but you can change to xml in the headers.

Accept: application/json

or

Accept: application/xml

INPUT BODY

The body of petition is json by default, but you can change it.

Content-Type: application/json

or

Content-Type: application/xml

API TOKEN

You can sent api rest token in headers, GET or POST variable like this.

X-API-KEY: TOKEN
http://example.com?X-API-KEY=key

LANGUAGE

You can sent language like this.

Accept-Language: en