Membuat Aplikasi Ekspedisi Lumen 6 #1: Schema Database

Membuat Aplikasi Ekspedisi Lumen 6 #1: Schema Database

Pendahuluan

Kabar gembira sekaligus kabar baik karena Daengweb.id kembali lagi membuat serial baru guna mewujudkan dan meramaikan referensi belajar bahasa pemrograman versi bahasa Indonesia. Pada serial kali ini kita akan belajar bagaimana membuat Aplikasi Ekspedisi Pengiriman menggunakan Lumen 6 dimana Lumen memiliki peran sebagai web service dengan menyediakan API (Application Programming Interface).

Contoh kasus ini akan diangkat sebagai case terpusat dimana kita akan belajar beberapa bahasa pemrograman dengan 1 contoh kasus saja dan saling berkomunikasi satu dengan yang lainnya. Adapun detail perannya adalah Nuxt.js berfungsi untuk men-delivery content sebagai aplikasi web, Flutter akan meng-handle sisi mobile (Android & iOS) dan Svelte akan melengkapi pilihan kita dalam membangun aplikasi web, serta bagian terakhir tentu saja Lumen dengan API-nya sebagai jembatan antar aplikasi.

Pertanyaannya, Nuxt dan Svelte apa bedanya? Bukannya sama saja untuk membuat aplikasi web? Lalu kenapa membahas keduanya? Sebagaimana kita ketahui bahwa Nuxt.js memiliki fitur SSR (Server Side Rendering) guna mendukung SEO (Search Engine Optimization) sehingga bisa disimpulkan bahwa framework ini tidaklah begitu berguna untuk aplikasi yang sifatnya internal tapi saya angkat sebagai materi pembelajaran untuk melengkapi pengetahuan kita tentang ragam framework.

Sedangkan Svelte sebagai framework baru cukup menggoda untuk dibahas dan dijadikan opsi lanjutan dalam membuat aplikasi yang interaktif dengan Javascript.

Lumen adalah micro-framework yang dikembangkan oleh Taylor Otwell dengan tujuan untuk membuat micro-services API, layaknya saudara kembar, Laravel dan Lumen tidak memiliki banyak perbedaan dalam penggunaannya, hanya saja Lumen adalah versi mini atau micro dari Laravel dengan tidak melupakan fitur-fitur yang hampir serupa dengan Laravel.

Lalu kanapa memilih Lumen? Karena tujuannya hanya API maka Lumen jauh potensial ketimbang Laravel yang memang didesain untuk fullstack developer.

Baca Juga: Aplikasi E-Commerce Laravel 6 #18: Membuat Fitur Afiliasi

Cara Install Lumen

Sebelum meng-install Lumen versi 6, pastikan kamu sudah meng-install php module yang dibutuhkan, diantaranya:

  1. Minimal > PHP 7.2
  2. OpenSSL PHP Extension
  3. PDO PHP Extension
  4. Mbstring PHP Extension

Tidak lupa pula untuk meng-install Composer karena ia memiliki peran dalam mengunduh seluruh code dari Lumen. Apabila sudah di-install, dari command line, jalankan command berikut untuk meng-install Lumen

composer create-project --prefer-dist laravel/lumen dw-logistik-api

Adapun struktur folder dan file antara Laravel dan Lumen sama saja, sehingga pada serial kali ini kita tidak akan membahas struktur dan kegunaan folder-folder yang ada di Lumen.

Membuat Struktur Database di Lumen

Salah satu fitur yang banyak digunakan oleh pengguna Laravel adalah Migration untuk mengontrol setiap perubahan dari struktur database. Lumen juga mengadopsi atau mungkin bisa disebut memiliki fitur tersebut dengan cara kerja dan cara penggunaan yang sama dengan Laravel.

Aplikasi yang akan kita kerjakan adalah Aplikasi Ekspedisi pengiriman barang maupun dokumen, sehingga hal pertama yang akan dikerjakan adalah struktur database-nya untuk memberikan gambaran awal akan seperti apa alur aplikasi yang akan kita buat.

aplikasi ekspedisi lumen - schema database

Buka project Lumen yang baru saja di-install, kemudian dari command line kita akan membuat file migration satu persatu sesuai dengan struktur database di atas.

Langkah pertama adalah membuat table users untuk menyimpan data pengguna baik itu admin, driver maupun karyawan lainnya, dari command line, jalankan command

php artisan make:migration create_users_table

File migration yang telah di-generate akan ditempatkan di dalam folder database/migrations, buka file migration untuk create user dan modifikasi menjadi

<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //AKAN MEMBUATA TABLE DENGAN NAMA users
        Schema::create('users', function (Blueprint $table) {
            //ADAPUN LIST FIELD BESERTA TIPE DATANYA ADALAH DIBAWAH INI
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('identity_id');
            $table->char('gender', 1)->comment('0: female, 1: male')->default(0);
            $table->string('address');
            $table->string('photo');
            $table->string('email')->unique();
            $table->string('password');
            $table->string('phone_number');
            $table->string('api_token', 40);
            $table->char('role', 1)->comment('0: admin, 1: drivers, 2: users');
            $table->boolean('status')->default(false);
            $table->timestamps();
        });
    }

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

Table selanjutnya adalah user_balances untuk menyimpan informasi saldo dari user dalam hal ini adalah driver. sehingga setiap driver bisa menyimpan saldonya dalam bentuk account dan dapat di withdraw ketika dibutuhkan. Generate migration-nya dengan command

php artisan make:migration create_user_balances_table

Buka file migration yang kedua dan modifikasi menjadi

<?php

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

class CreateUserBalancesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('user_balances', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->integer('balance');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');
        });
    }

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

Kemudian dilanjutkan dengan table fleets yang akan menampung data kendaraan atau armada yang dimiliki dan setiap kendaraan akan bereleasi dengan driver / users dengan role driver. Dari command line, jalankan

php artisan make:migration create_fleets_table

Modifkasi migration yang meng-handle create table fleets menjadi

<?php

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

class CreateFleetsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('fleets', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('plate_number')->unique();
            $table->char('type', 1)->comment('0: car, 1: motorcycle');
            $table->string('photo');
            $table->unsignedBigInteger('user_id');
            $table->timestamps();

            //MEMBUAT RELASI KE TABLE USERS DENGAN FOREIGN KEY USER_ID DAN TERHUBUNG DENGAN ID YANG ADA DI USERS
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

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

Table categories adalah table yang akan kita buat selanjutnya, dimana table ini akan berfungsi sebagai data kategori pengiriman, seperti dokumen, makanan, ataupun product lainnya.

php artisan make:migration create_categories_table

Kemudian modifikasi migration tersebut dengan memasukkan code berikut

<?php

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

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('description')->nullable();
            $table->timestamps();
        });
    }

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

Untuk merekam setiap dana keluar dan dana masuk dari driver, maka kita memerlukan table bantuan untuk mencatat history tersebut. Tujuannya adalah untuk tracking dari mana dana tersebut didapatkan dan kemana dana tersebut digunakan, sehingga pemilik aplikasi dan driver memiliki transparansi dalam hal komisi yang diberikan. Dari command line, jalankan

php artisan make:migration create_balance_histories_table

Modifikasi migration-nya menjadi

<?php

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

class CreateBalanceHistoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('balance_histories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('user_balance_id');
            $table->string('note');
            $table->integer('amount');
            $table->boolean('status');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');
            $table->foreign('user_balance_id')->references('id')->on('user_balances');
        });
    }

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

Mencatat data pelanggan dengan schema setiap pelanggan tersebut memiliki poin dan bisa menyimpan kembaliannya dalam bentuk deposit jika diperlukan, setiap poin yang didapatkan adalah dari setiap transaksi yang dilakukan. Pelanggan dalam hal ini adalah pengguna jasa yang mengirimkan barang, bukan penerima. Generate migration-nya dengan command.

php artisan make:migration create_customers_table

Buka file migration-nya dan ubah menjadi

<?php

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

class CreateCustomersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('phone_number');
            $table->string('address');
            $table->integer('point');
            $table->integer('deposit');
            $table->timestamps();
        });
    }

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

Bagian yang terpenting adalah table untuk meng-handle data pesanan atau transaksi yang terjadi, generate migration untuk table orders

php artisan make:migration create_orders_table

Modifikasi migration-nya menjadi

<?php

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

class CreateOrdersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('orders', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('tracking_number')->unique();
            $table->unsignedBigInteger('customer_id');
            $table->string('sender_name');
            $table->string('sender_phone');
            $table->string('sender_address');
            $table->string('delivery_name');
            $table->string('delivery_phone');
            $table->string('delivery_address');
            $table->unsignedBigInteger('category_id');
            $table->integer('shipping_cost');
            $table->integer('item_price');
            $table->boolean('is_insurance')->default(false);
            $table->unsignedBigInteger('user_id');
            $table->integer('user_fee');
            $table->string('note')->nullable();
            $table->string('shipping_photo');
            $table->string('delivered_photo');
            $table->char('status', 1)->comment('0: new, 1: shipping, 2: complete, 3: complaint, 4: cancel');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');
            $table->foreign('category_id')->references('id')->on('categories');
            $table->foreign('customer_id')->references('id')->on('customers');
        });
    }

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

Kerusakan dalam pengiriman bisa saja terjadi, sehingga penerima bisa saja melakukan komplain melalui driver, maka table selanjutnya adalah table untuk meng-handle data komplain tersebut. Dari command line, jalankan command

php artisan make:migration create_order_complaints_table

Modifikasi migration terakhir ini menjadi

<?php

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

class CreateOrderComplaintsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('order_complaints', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('order_id');
            $table->string('reason');
            $table->string('photo');
            $table->text('investigation_note')->nullable();
            $table->char('status', 1)->comment('0: open, 1: complete, 2: cancel, 3: process')->default(false);
            $table->timestamps();

            $table->foreign('order_id')->references('id')->on('orders');
        });
    }

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

Sebelum mengeksukusi seluruh file migration yang telah kita buat, maka langkah yang harus dilakukan adalah menghubungkan antara Lumen dengan database. Buka file .env dan modifikasi bagian berikut dengan memasukkan informasi database anda

DB_DATABASE=dw-logistik
DB_USERNAME=USERNAME DATABASE ANDA
DB_PASSWORD=PASSWORD DATABASE ANDA

Pastikan sudah membuat database-nya dengan nama dw-logistik. Kemudian dari command line, jalankan command berikut untuk mengeksekusi seluruh migration tersebut, sehingga secara otomatis akan men-generate seluruh table yang ada.

php artisan migrate

aplikasi ekspedisi lumen - database design

Baca Juga: Aplikasi E-Commerce Laravel 6 #16: Integrasi Telegram Bot

Kesimpulan

Langkah awal dalam membangun aplikasi ekspedisi menggunakan Lumen adalah membuat struktur database, sehingga sepanjang artikel ini kita telah belajar bagaimana cara meng-install Lumen, bagaimana cara menghubungkan Lumen dengan database, bagaimana mengontrol perubahan dan membuat struktur database menggunakan migration di Lumen dan lain sebagainya.

Adapun dokumentasi code dari artikel ini bisa dilihat di Github.

Category:
Share:

Comments