Membuat Restful Api Lumen Dengan Validasi Dan Autorisasi

- install Composer jika memang belum ada composer, untuk download disini.

- selanjutnya masuk ke folder htdocs anda menggunakan command prompt / terminal.

- setelah itu pada command prompt / terminal tuliskan perintah : composer create-project --prefer-dist  laravel/lumen SalesApi.

- tunggu hingga proses download selesai.

- kemudian buka project menggunakan text editor pilihan anda.

- pada file bootstrap/app.php, uncomment 2 baris ini sehingga tampak seperti :

$app->withFacades();
$app->withEloquent();

- setting .env file sesuai dengan konfigurasi database anda

- buat database sesuai dengan konfigurasi pada .env file

- buat table sesuai kebutuhan, dengan contoh mengeksekusi table products : php arisan make:migration create_products_table

- sesuaikan attribut table sesuai dengan kebutuhan, pada contoh :

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProductsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->increments('product_id');
$table->string('product_name', 256);
$table->double('product_price');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('products');
}
}

- setelah membuat table, maka selanjutnya mengeksekusi migrasi : php artisan migrate

- install lumen generator : composer require --dev flipbox/lumen-generator

- tambahkan kode sebelum "return $app" :

if($app->environment() !== 'production'){
$app->register(Flipbox\LumenGenerator\LumenGeneratorServiceProvider::class);
}

- generate controller dengan perintah : php artisan make:controller ProductController --resource

- ubah kode seperti berikut untuk validasi dan relasi :

<?php

namespace App\Http\Controllers;

date_default_timezone_set('Asia/Jakarta');
use Illuminate\Http\Request;
use App\Product;

class ProductController extends Controller
{
public function __construct(\App\Product $product){
$this->post = $product;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$product = $this->post->paginate(20);
$product = Product::with(array('bills'))->get()->toArray();
return $product;
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
$input = $this->validate($request, [
'product_name' => 'required',
'product_price' => 'required'
]);
$product = $this->post->create($input);

return [
'data' => $product
];
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
$product = $this->post->find($id);
$product = Product::with(array('bills'))->where('product_id', $id)->get()->toArray();

if(!$product){
$product = ['message' => 'Sorry, data not available'];
}

return $product;
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
$input = $request->all();
$empty = array_filter($input);

$product = $this->post->find($id);

isset($request['product_name']) ? $this->validate($request, ['product_name' => 'required']) : '';
isset($request['product_price']) ? $this->validate($request, ['product_price' => 'required']) : '';

if(!$product){
$product = ['message' => 'Sorry, data not available'];
}
elseif(empty($empty)){
$product = ['message' => 'Please fill data'];
}
else{
$product->fill($input);
$product->save();
}

return $product;
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
$product = $this->post->find($id);

if(!$product){
$product = ['message' => 'Sorry, data not available'];
}
else{
$product->delete();
$product = ['message' => 'deleted successfully', 'product_id' => $id];
}

return $product;
}
}

- pada routes/web.php tambahkan :

$router->get('/api/products', [
'uses' => 'ProductController@index',
'as' => 'list_products'
]);

resource($router, 'api/products', 'ProductController');

- serta menambah functiomn resource :

function resource($router, $uri, $controller, $bill = false){
if($bill){
$router->get($uri, $controller.'@index');
$router->post($uri, $controller.'@store');
$router->get($uri.'/{id}', $controller.'@show');
}
else{
$router->get($uri, $controller.'@index');
$router->post($uri, $controller.'@store');
$router->get($uri.'/{id}', $controller.'@show');
$router->put($uri.'/{id}', $controller.'@update');
$router->patch($uri.'/{id}', $controller.'@update');
$router->delete($uri.'/{id}', $controller.'@destroy');
}
}

- untuk melihat route list eksekusi perintah : php artisan route:list


- buat model dengan eksekusi : php artisan make:model Product

- buka file app/Product.php, dan ubah kode seperti berikut :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
//
protected $primaryKey = 'product_id';
protected $fillable = array('product_name', 'product_price');

public function bills(){
return $this->hasMany('App\Bill', 'product_id', 'product_id');
}
}

- selanjutnya menambahkan securing, uncomment kode di bawah pada file bootstrap/app.php :

$app->routeMiddleware([
'auth' => App\Http\Middleware\Authenticate::class,
]);

$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);

- buat admin migration : php artisan make:migration create_admin_table

- lalu sesuaikan atribut table, pada contoh :
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAdminTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('admin', function (Blueprint $table) {
$table->increments('admin_id');
$table->string('admin_name', 64)->unique();
$table->string('admin_password', 128);
$table->string('api_token', 256)->nullable();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('admin');
}
}

- eksekus : php artisan migrate

- buat model admin : php artisan make:model Admin

- pada app/admin.php ubah seperti berikut :

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;

class Admin extends Model implements AuthenticatableContract, AuthorizableContract
{
use Authenticatable, Authorizable;

//
public $table = 'admin';
protected $primaryKey = 'admin_id';
protected $fillable = array('admin_name', 'admin_password', 'api_token');
protected $hidden = ['admin_password', 'api_token'];

public function bills(){
return $this->hasMany('App\Bill', 'admin_id', 'admin_id');
}
}

- buat admin controller, pada app/Http/Controllers/AdminController.php ubah seperti :

<?php

namespace App\Http\Controllers;

date_default_timezone_set('Asia/Jakarta');
use Illuminate\Http\Request;
use App\Admin;

class AdminController extends Controller
{
function __construct(\App\Admin $admin){
$this->post = $admin;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/

public function register(Request $request){
$this->validate($request, [
'admin_name' => 'required|unique:admin',
'admin_password' => 'required'
]);

$hasher = app()->make('hash');
$name = $request->input('admin_name');
$password = $hasher->make($request->input('admin_password'));
$admin = Admin::create([
'admin_name' => $name,
'admin_password' => $password
]);
$result = [
'success' => true,
'message' => 'Success Register !',
'data' => $admin
];

return response($result);
}
public function index()
{
//
$admin = $this->post->paginate(20);
$admin = Admin::with(array('bills'))->get()->toArray();
return $admin;
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
$this->validate($request, [
'admin_name' => 'required|unique:admin',
'admin_password' => 'required'
]);

$input = [
'admin_name' => $request->input('admin_name'),
'admin_password' => md5($request->input('admin_password'))
];

$admin = $this->post->create($input);

return [
'data' => $admin
];
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
$admin = $this->post->find($id);
$admin = Admin::with(array('bills'))->where('admin_id', $id)->get()->toArray();

if(!$admin){
$admin = ['message' => 'Sorry, data not available'];
}

return $admin;
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
$input = $request->all();
$empty = array_filter($input);

$admin = $this->post->find($id);

isset($request['admin_name']) ? $this->validate($request, ['admin_name' => 'required|unique:admin,admin_name,'.$id.',admin_id']) : '';
isset($request['admin_password']) ? $this->validate($request, ['admin_password' => 'required']) : '';

if(isset($request['admin_password'])){
$admin_password = ['admin_password' => md5($request->input('admin_password'))];
$input = array_merge($input, $admin_password);
}

if(!$admin){
$admin = ['message' => 'Sorry, data not available'];
}
elseif(empty($empty)){
$admin = ['message' => 'Please fill data'];
}
else{
$admin->fill($input);
$admin->save();
}

return $admin;
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
$admin = $this->post->find($id);

if(!$admin){
$admin = ['message' => 'Sorry, data not available'];
}
else{
$admin->delete();
$admin = ['message' => 'deleted successfully', 'admin_id' => $id];
}

return $admin;
}
}

- pada routes/web.php tambahkan kode :

$router->post('/api/admin/register','AdminController@register');

- buat auth controller : php artisan make:controller AuthController

- pada app/Http/Controllers/AuthController.php ubah seperti :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Admin;

class AuthController extends Controller
{
//
public function login(Request $request){
$hasher = app()->make('hash');

$name = $request->input('admin_name');
$password = $request->input('admin_password');
$login = Admin::where('admin_name', $name)->first();

if(!$login){
$result = [
'success' => false,
'message' => 'Your name or password incorrect!'
];

return response($result);
}
else{
if($hasher->check($password, $login->admin_password)){
$api_token = sha1(time());
$create_token = Admin::where('admin_id', $login->admin_id)->update(['api_token' => $api_token]);
if($create_token){
$result = [
'success' => true,
'api_token' => $api_token,
'message' => $login
];

return response($result);
}
}
else{
$result = [
'success' => true,
'message' => 'Your name or password incorrect!'
];

return response($result);
}
}
}
}

- tambahkan kode pada routes/web.php :

$router->post('/api/auth/login','AuthController@login');

- tambah authorization pada saat membuat bill, contoh kode :

<?php

namespace App\Http\Controllers;

date_default_timezone_set('Asia/Jakarta');
use Illuminate\Http\Request;
use Auth;

class BillController extends Controller
{
function __construct(\App\Bill $bill){
$this->middleware('auth', ['only' => ['store']]);
$this->post = $bill;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$bill = $this->post->paginate(20);
return $bill;
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
$input = $this->validate($request, [
'transaction_date' => 'required',
'customer_id' => 'required',
'admin_id' => 'required',
'product_id' => 'required',
'total_product' => 'required'
]);
$bill = $this->post->create($input);

return [
'data' => $bill
];
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
$bill = $this->post->find($id);

if(!$bill){
$bill = ['message' => 'Sorry, data not available'];
}

return $bill;
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}

- Validasi Product :



- Relasi Product :


- Autorisasi Admin :





Komentar