menu

Laravel - RabbitMQ (send message)


Pada tutorial sebelumnya kita sudah menginstall rabbitmq, tutorial kali ini kita akan membuat engine send message to rabbitmq dari framework laravel.

Engine yang akan kita buat ini akan kita ditempel pada project laravel yang sudah kita buat sebelumnya (silahkan ikuti tutorial laravel secara terurut, bisa lihat di books), atau download projectnya disini.

Pertama, install library rabbitmq pada laravel, dalam hal ini kita akan menggunakan library php-amqplib/php-amqplib, install library dengan cara, ketikan pada terminal code berikut,
php composer require php-amqplib/php-amqplib

Selanjutnya, tambahkan route baru untuk controller rabbitmq yang akan kita buat, terletak pada path protected/app/routes file web.php
///////////
// QUEUE //
///////////
Route::group(array('prefix' => 'queue'), function(){
 Route::get('sendRabbit', 'Controller\QueueController@sendRabbit');
});

Setelah itu, buat controller baru dengan nama QueueController.php pada path protected/app/controllers/ dan masukkan code berikut,
<?php namespace Controller;

use Model\User;
use \Input;
use \View;
use \Validator;
use \Redirect;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

class QueueController extends \BaseController 
{
 function sentQueueRabbitMQ($message = [])
 {
    $connection = new AMQPStreamConnection(RABBITMQ_HOST, RABBITMQ_PORT, RABBITMQ_LOGIN, RABBITMQ_PASSWORD);

    $channel = $connection->channel();

    if (!empty($message)) {
      $message = new AMQPMessage(json_encode($message));
      $channel->basic_publish($message, '', RABBITMQ_QUEUE);
    }

    $channel->close();
    $connection->close();
 }

 public function sendRabbit()
 {
  $id = str_random(4);
  $message = [
   'id' => $id,
   'message' => 'halo '.$id
  ];
  $this->sentQueueRabbitMQ($message);
  return Redirect::to('/');
 }
}

Terakhir buat tampilannya untuk test saja berupa satu button untuk mengirim message yang berupa json ke rabbitmq dengan cara,
edit file header.blade.php pada path protected/app/views/layouts/web/ menjadi seperti ini,
<div class="header">
 <div class="banner">
  <div class="welcome">Welcome</div>
  {{-- code dibawah ini menggunakan constant variabel --}}
  <div class="gambar"><a href="#"><img src="{{ IMAGE_HEADER }}" style="width:"100px" height="129px";"></a></div>
 </div>
 <hr>
 <div class="menu">
  <div class="kiri">
   <li>
    <div class="dropdown">
      <button class="btn btn-default">Menu(css)</button>
      <div class="dropdown-content">
        <a href="{{ URL::to('crud/users')}}">User</a>
        <a href="{{ URL::to('book')}}">Index Book</a>
        <a href="{{ URL::to('javaScript/js1')}}">Belajar Script</a>
        <a href="{{ URL::to('javaScript/js2')}}">Belajar Script2</a>
        <a href="{{ URL::to('javaScript/js3')}}">Belajar Script3</a>
        <a href="{{ URL::to('javaScript/js4')}}">Belajar Script4</a>
        <a href="{{ URL::to('javaScript/js5')}}">Belajar Script5</a>
        <a href="{{ URL::to('javaScript/js6')}}">Belajar Script6</a>
        <a href="{{ URL::to('javaScript/js7')}}">Belajar Script7</a>
      </div>
    </div>
   </li>
   <li>
     <div class="dropdown-script">
      <button onclick="myFunction()" class="dropbtn btn btn-default">Translate</button>
      <div id="myDropdown" class="dropdown-content-script">
        <a href="{{ URL::to('lang/en') }}">English</a>
        <a href="{{ URL::to('lang/ina') }}">Indonesia</a>
      </div>
     </div>
   </li>
  </div>
  <div class="kanan">
   @if(Auth::user())
    <li onclick="if(confirm('Are you sure to logout?')) location.href='{{ URL::to('logout') }}';">Logout</li>
   @else
    <li onclick="location.href='{{ URL::to('login') }}';">Login</li>
   @endif
   <li onclick="location.href='{{ URL::to('register') }}';">Register</li>

   <!-- Send queue rabbit -->
   <li onclick="location.href='{{ URL::to('queue/sendRabbit') }}';">Send Rabbit</li>
  </div>
 </div>
</div>

Sehingga tampilannya akan tampak seperti ini,


Saat di klik button Send Rabbit maka pada rabbitmq (http://localhost:15672/#/) akan muncul tampilan seperti ini,



Tutorial berikutnya kita akan membuat engine untuk consume message rabbitmq,

===DONE!===

Laravel - RabbitMQ (Setup)


Back to code, lebih dari sebulan vakum akhirnya bisa eksperimen lagi,
pada eksperimen kali ini kita akan bereksperimen membuat sebuah engine rabbitmq yang akan disematkan pada project laravel, rabbitmq adalah salah satu perangkat lunak manajemen antrian yang digunakan untuk pengiriman pesan. Eksperiment ini akan dibagi menjadi 3 tutorial,
  1. Setup rabbitmq
  2. Send message
  3. Consume message
Pada tutorial yang pertama kita akan menginstall rabbitmq pada komputer,
Oke langsung saja kita mulai tutorialnya, pertama install rabbitmq terlebih dahulu dengan cara ikuti saja langkah ini https://www.rabbitmq.com/download.html karena saya menggunakan macOS maka saya akan menggunakan homebrew https://www.rabbitmq.com/install-homebrew.html
brew update
brew install rabbitmq

Jika muncul error ini,



Ini berarti anda tidak memiliki akses pada folder man5, ketikan saja code berikut pada terminal,
sudo chown -R nama_user_mac:admin /usr/local/share
jika sudah ketikan code berikut pada terminal,
brew link rabbitmq

Jika tidak muncul error diatas, langsung lanjut saja ke bawah,
Setelah selesai install rabbitmq pada komputer maka nyalakan servernya pada localhost dengan cara,
ketikan pada terminal
/usr/local/sbin/rabbitmq-server

Sehingga akan muncul seperti pada gambar dibawah,


Untuk mematikan server rabbitmq ketikan syntax berikut pada terminal
/usr/local/sbin/rabbitmqctl stop

Sekarang buka browser dan buka link ini http://localhost:15672/#/ (user:guest password:guest) sehingga akan muncul tampilan seperti ini,


Selanjutnya tambahkan queue pada rabbitmq, caranya

  • Masuk ke menu Queues
  • Isi name
  • Klik Add queue


Tutorial selanjutnya send message,

===DONE!===

Engine - Chat with firebase


Pada tutorial kali ini, codedoct akan sharing membuat engine chat sederhana dengan firebase, apa itu firebase bisa baca disini,

Oke langsung saja kita mulai experimentnya, hal pertama yang harus dilakukan adalah sign-in terlebih dahulu ke firebase-console dengan menggunakan akun gmail anda, jika belum punya akun gmail? silahkan buat terlebih dahulu.

Jika anda sudah login maka akan tampak seperti pada gambar dibawah ini,


Klik tambahkan proyek untuk membuat proyek baru, akan tampak seperti gambar dibawah,


Jika sudah dibuat maka anda akan masuk ke halaman ini,


Masuk ke menu database dengan meng-click submenu "Database" disebelah kiri halaman, dan akan tampil seperti gambar dibawah,


Selanjutnya kita akan mengimpor database yang sudah saya buat terlebih dahulu sebagai template database. Caranya bisa lihat pada gambar diatas, sehingga akan tampak gambar dibawah,


Silahkan dowload database ini, kemudian pada gambar diatas klik jelajahi dan silahkan pilih database yang sudah di download tadi. Sehingga akan tampah database seperti pada gambar dibawah,


Selanjutnya kita akan membuat auth pada engine firebase kita, masuk ke menu "Authentification" dan klik "Metode Masuk" seperti pada gambar dibawah,


Klik Google dan aktifkan seperti pada gambar dibawah,


Jika semua sudah dilakukan, sekarang kita akan setup engine sederhana yang sudah saya buat, buat folder pada htdocs (bagi pengguna windows, yang lain menyesuaikan hehe..), saya akan buat folder bernama "firebase" dan buat file format php dengan nama index.php pada folder "firebase" tersebut kemudian isikan code berikut,
<!DOCTYPE html>
<html>
<head>
 <!-- Letakan code firebase disini -->

 <!-- ============================ -->

 <title>Experiment Firebase</title>
 <script type="text/javascript">
  window.onload = function () { 
   var user = userShow();
   if (user) {
    loadMessage();
    alert('Welcome '+user.displayName+'!');
   }
  }

  function login() {
   var provider = new firebase.auth.GoogleAuthProvider();
   firebase.auth().signInWithPopup(provider).then(function(result) {
     console.log("login");
   }).catch(function(error) {
     // Handle Errors here.
     var errorCode = error.code;
     var errorMessage = error.message;
     // The email of the user's account used.
     var email = error.email;
     // The firebase.auth.AuthCredential type that was used.
     var credential = error.credential;
     // ...
   });
  }

  function userShow() {
   var auth = localStorage['firebase:authUser:'+config.apiKey+':[DEFAULT]'] ? localStorage['firebase:authUser:'+config.apiKey+':[DEFAULT]'] : null;
   if (auth) {
    var result = JSON.parse(auth);
    console.log(result.displayName);
    return result;
   } else {
    alert('Please login first.');
   }
  }

  function logout() {
   firebase.auth().signOut().then(function() {
     // Sign-out successful.
     console.log("logout");
   }).catch(function(error) {
     // An error happened.
   });
  }

  function sendMessage() {
   var messageContent = document.getElementById('message').value;
   var user = userShow();

   if (user) {
    var data = {
     name:user.displayName,
     message:messageContent
    };
    // console.log(message);
    var firebaseRef = firebase.database().ref('messages');
    firebaseRef.push(data);
    document.getElementById('message').value = '';
   }
  }

  function loadMessage() {
   var dataMessages = firebase.database().ref('messages').limitToLast(5);
   dataMessages.on('value', function(messages) {
      var messagesList = document.getElementById('messages-list');
      var boxChat = document.getElementById('box-chat');

       if (messages.val()) {
     messagesList.parentNode.removeChild(messagesList);
     boxChat.innerHTML = boxChat.innerHTML + '<div id="messages-list"></div>';
     var messagesList = document.getElementById('messages-list');
       for (var message in messages.val()) {
      messagesList.innerHTML = messagesList.innerHTML + "<p>" + messages.val()[message].name + " || " + messages.val()[message].message + "</p>"; 
     }
       } else {
        console.log('data not found');
       }
   });
  }
 </script>
</head>
<body>
 <button type="button" onclick="login()">Login</button> || <button type="button" onclick="userShow()">User</button> || <button type="button" onclick="logout()">Logout</button>
 <br><br>
 <div id="box-chat">
  <div id="messages-list"></div>
 </div>
 <textarea placeholder="Write the message" id="message"></textarea>
 <button type="submit" onclick="sendMessage()">Send</button>
</body>
</html>

Jika sudah, masuk ke path folder firebase tadi dengan menggunakan PowerShell kemudian install firebase-tools ketikan code berikut,


Setelah itu login,


Initiate firebase dan user --add


Oke semua sudah di set sekarang tinggal menghubungkan engine dengan firebasenya saja, buka kembali firebase-console tadi,


Dan klik "Tambahkan Firebase ke apliksi web anda" salin codenya dan letakkan code firebase ke engine firebase yang sudah saya siapkan tempatnya sehingga akan terlihat seperti gambar dibawah,


Buka halaman engine firebase pada browser sehingga akan tampak seperti pada gambar dibawah ini,


Klik "Login", menggunakan user gmail, karna sudah kita aktifkan authentification untuk gmail, jika berhasil login, coba refresh halaman sehingga akan tampak seperti pada gambar dibawah,


Jika kita inspect halaman saat kita klik "User" maka akan tampak username gmail yang kita gunakan untuk login seperti gambar dibawah,


===DONE!===

Syntax - Syntax elasticsearch


Pada tutorial kali ini, codedoct akan sharing syntax2 untuk elasticsearch, apa itu elasticsearch? bisa cari tahu di official websitenya langsung disini,

Untuk mengetesnya bisa menggunakan postman yang diinstall pada chrome,
Oke langsung saja sharing ilmu.

Test elasticsearch

Add index

Get index

Add document

Get document

Search Document

Show Document

Bulk Document

Edit document

Delete document

Delete index


===DONE!===

Laravel - RESTful project (API delete data)


Pada tutorial kali ini kita akan membuat sebuah engine REST-ful untuk delete data, sebagai lanjutan tutorial yang sebelumnya.

Sama seperti tutorial sebelumnya untuk dapat melakukan delete data user maka kita harus melempar parameter ID data user yang akan didelete.

Oke langsung saja kita mulai experimentnya,
Pertama, tambahkan route baru untuk method baru delete ini dengan mengedit code pada file route api.php yang terletak pada path protected/app/routes/ edit menjadi seperti ini,
<?php 

//////////
// CRUD //
//////////
//pahamilah group route dibawah
Route::group(array('prefix' => 'crud'), function(){
 Route::get('users', 'Controller\Api\UserController@getUsers');
 Route::post('store-user', 'Controller\Api\UserController@storeUser');
 Route::get('{id}', 'Controller\Api\UserController@showUser');
 Route::patch('{id}', 'Controller\Api\UserController@updateUser');
 Route::delete('{id}', 'Controller\Api\UserController@deleteUser');
});

Selanjutnya, edit file UserController.php pada path protected/app/controllers/api/ menjadi seperti ini,
<?php namespace Controller\Api;

use Model\User;
use \Response;
use \Validator;
use \Input;
use Illuminate\Http\Request;


class UserController extends \BaseController 
{
 public function getUsers()
 {
  $users = User::get();

  $response['status'] = 'OK';
  $response['result'] = $users;

  return Response::json($response);
 }

 public function storeUser()
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username",
    "email"     => "required|email|unique:users,email",
       "password"              => "required|min:6",
   )
  );
  // dd($_POST);
  if ($validator->passes()) {
      $user = User::storeOrUpdateUser(Input::all(), null);
      // dd($_POST);
      $response['status'] = 'OK';
      $response['result'] = $user;
     }
     else {
      $response['status'] = 'ERROR';
      $response['message'] = $validator->messages();
     }

  return Response::json($response);
 }

 public function showUser($id)
 {
  $user = User::find($id);

  if ($user) {
   $response['status'] = 'OK';
   $response['result'] = $user;
  } else {
   $response['status'] = 'ERROR';
   $response['message'] = 'User not found';
  }

  return Response::json($response);
 }

 public function updateUser($id)
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username,".$id,
    "email"     => "required|email|unique:users,email,".$id,
       "password"              => "required|min:6",
   )
  );

  $user = User::find($id); 
  
  if ($user) {
   if ($validator->passes()) {
       $user = User::storeOrUpdateUser(Input::all(), $user);
       $response['status'] = 'OK';
       $response['result'] = $user;
      }
      else {
       $response['status'] = 'ERROR';
       $response['message'] = $validator->messages();
      }
  } else {
   $response['status'] = 'ERROR';
      $response['message'] = 'User not found';
  }

  return Response::json($response);
 }

 public function deleteUser($id)
 {
  $user = User::find($id);

  if ($user) {
   $user->delete();
   $response['status'] = 'OK';
   $response['result'] = 'Success delete user';
  } else {
   $response['status'] = 'ERROR';
   $response['message'] = 'User not found';
  }

  return Response::json($response);
 }
}

Terakhir, test pada postman jika ID user ditemukan maka proses delete user berhasil,



Jika ID user tidak ditemukan maka akan muncul error seperti ini,



===DONE!===

Laravel - RESTful project (API update data)



Pada tutorial sebelumnya kita sudah membuat API untuk show data, tutorial kali ini kita akan meneruskan sistem RESTful membuat API update data. Pada API ini kita akan melemparkan parameter ID yang mrupakan ID data yang akan di edit datanya.

Oke langsung saja kita mulai experimentnya,
Pertama, buat terlebih dahulu route APInya dengan cara edit file api.php pada path protected/app/routes/ menjadi seperti ini,
<?php 

//////////
// CRUD //
//////////
//pahamilah group route dibawah
Route::group(array('prefix' => 'crud'), function(){
 Route::get('users', 'Controller\Api\UserController@getUsers');
 Route::post('store-user', 'Controller\Api\UserController@storeUser');
 Route::get('{id}', 'Controller\Api\UserController@showUser');
 Route::patch('{id}', 'Controller\Api\UserController@updateUser');
});
Dapat dilihat pada code diatas, RESTful untuk update data menggunakan method PATCH.

Selanjutnya, buat method untuk update atau edit dengan cara edit file UserController.php pada path protected/app/controllers/api/ menjadi seperti ini,
<?php namespace Controller\Api;

use Model\User;
use \Response;
use \Validator;
use \Input;
use Illuminate\Http\Request;


class UserController extends \BaseController 
{
 public function getUsers()
 {
  $users = User::get();

  $response['status'] = 'OK';
  $response['result'] = $users;

  return Response::json($response);
 }

 public function storeUser()
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username",
    "email"     => "required|email|unique:users,email",
       "password"              => "required|min:6",
   )
  );
  // dd($_POST);
  if ($validator->passes()) {
      $user = User::storeOrUpdateUser(Input::all(), null);
      // dd($_POST);
      $response['status'] = 'OK';
      $response['result'] = $user;
     }
     else {
      $response['status'] = 'ERROR';
      $response['message'] = $validator->messages();
     }

  return Response::json($response);
 }

 public function showUser($id)
 {
  $user = User::find($id);

  if ($user) {
   $response['status'] = 'OK';
   $response['result'] = $user;
  } else {
   $response['status'] = 'ERROR';
   $response['message'] = 'User not found';
  }

  return Response::json($response);
 }

 public function updateUser($id)
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username,".$id,
    "email"     => "required|email|unique:users,email,".$id,
       "password"              => "required|min:6",
   )
  );

  $user = User::find($id); 

  if ($user) {
   if ($validator->passes()) {
       $user = User::storeOrUpdateUser(Input::all(), $user);
       $response['status'] = 'OK';
       $response['result'] = $user;
      }
      else {
       $response['status'] = 'ERROR';
       $response['message'] = $validator->messages();
      }
  } else {
   $response['status'] = 'ERROR';
      $response['message'] = 'User not found';
  }

  return Response::json($response);
 }
}

Kemudian, kita test dengan menggunakan postman dengan memasukan url dan method seperti pada gambar dibawah ini,


Terakhir masukan parameter yang akan kita edit datanya seperti pada gambar dibawah,
Dapat dilihat pada gambar diatas, body yang kita lempar menggunakan postman menggunakan format x-www-form-urlencoded bukan form-data seperti pada API store data, hal ini dikarenakan kita menggunakan method PATCH yang tidak support menggunakan format form-data.

Sehingga hasilnya akan tampak seperti pada gambar dibawah ini,



===DONE!===

Laravel - RESTful project (API show data)


Tutorial sebelumnya kita sudah membuat RESTful untuk store data, pada tutorial kali ini kita akan membuat RESTful sistem untuk menampilkan data berdasarkan ID yang ingin ditampilkan.

Oke, langsung saja kita mulai experimentnya,
Pertama, buat dulu route yang akan mengarah pada API show data dengan mengedit file api.php pada path protected/app/routes/ menjadi seperti ini,
<?php 

//////////
// CRUD //
//////////
//pahamilah group route dibawah
Route::group(array('prefix' => 'crud'), function(){
 Route::get('users', 'Controller\Api\UserController@getUsers');
 Route::post('store-user', 'Controller\Api\UserController@storeUser');
 Route::get('{id}', 'Controller\Api\UserController@showUser');
});

Selanjutnya, buat method baru yang akan mengarahkan pada url show data tersebut dengan mengedit file UserController.php pada path protected/app/controllers/api/ menjadi seperti ini,
<?php namespace Controller\Api;

use Model\User;
use \Response;
use \Validator;
use \Input;
use Illuminate\Http\Request;


class UserController extends \BaseController 
{
 public function getUsers()
 {
  $users = User::get();

  $response['status'] = 'OK';
  $response['result'] = $users;

  return Response::json($response);
 }

 public function storeUser()
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username",
    "email"     => "required|email|unique:users,email",
       "password"              => "required|min:6",
   )
  );
  // dd($_POST);
  if ($validator->passes()) {
      $user = User::storeOrUpdateUser(Input::all(), null);
      // dd($_POST);
      $response['status'] = 'OK';
      $response['result'] = $user;
     }
     else {
      $response['status'] = 'ERROR';
      $response['message'] = $validator->messages();
     }

  return Response::json($response);
 }

 public function showUser($id)
 {
  $user = User::find($id);

  if ($user) {
   $response['status'] = 'OK';
   $response['result'] = $user;
  } else {
   $response['status'] = 'ERROR';
   $response['message'] = 'User not found';
  }

  return Response::json($response);
 }
}

Kemudian testing dengan Postman masukan url seperti pada gambar dibawah dan dengan method GET, jangan lupa untuk mengganti "http://localhost:2305/BLOG/" sesuaikan dengan url lokal komputer anda,


Sehingga saat di Send hasilnya akan tampak seperti ini,



===DONE!===