2 min read

Laravel 5.8: Membuat Masa "Trial" Untuk User

Laravel 5.8: Membuat Masa "Trial" Untuk User

Berkembangnya SaaS ( Software as a Service ) saat ini sering kali saya menemukan layanan-layanan yang menyediakan masa ujicoba ( trial ) kepada calon pengguna baru. Tulisan ini mencoba membuat hal tersebut menggunakan Laravel.

Menambahkan field “trial periode”

Pertama saya buat satu field baru di tabel users bernama “trial_periode”, isinya berupa datetime yang menunjukan masa terakhir trial.

php artisan make:migration add_field_trial_periode --table=users

Isi dari berkas migration

 public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->datetime('trial_periode')->nullable();
        });
    }

public function down()
    {
        if (Schema::hasColumn('users', 'trial_periode'))
        {
            Schema::table('users', function (Blueprint $table)
            {
                $table->dropColumn('trial_periode');
            });
        }
    }

Lakukan perintah migration untuk menambahkan field tersebut ke tabel

php artisan migrate

Pendaftaran

Buat langsung saja di routes biar cepat, intinya pendaftar yang memilih trial akan otomatis ditambahkan 14 hari masa uji coba.

Route::post('/register', function (Request $request) {
    
    $trial = isset($request->trial) ? Carbon::now()->add(14,'day') : null;
    DB::beginTransaction();
    try {
       $user =  User::create([
            'name'=>$request->name,
            'password'=>bcrypt($request->password),
            'email'=>$request->email,
            'trial_periode'=>$trial
        ]);
        DB::commit();
        return response()->json($user, 200);
    } catch (\Exception $e) {
        DB::rollback();
        return response()->json($e->getMessage(), 500);
    }
});

Setelah itu silahkan login seperti biasa.

Menambahkan Informasi Sisa Hari

Di model User tambahkan Accessor untuk mengambil sisa masa berlaku

public function getTrialRemainingAttribute() {
        return Carbon::now()->diffInDays($this->trial_periode, false);
    }

Selanjutnya di routes saya tambahkan alamat baru yaitu “/status” untuk menampilkan status user yang sedang login.

Route::get('/status', function () {
    $user = Auth::user();
    return view('status',compact('user'));
})->middleware('auth');

Sedangkan isi dari view nya sendiri hanya seperti ini

<div class="content">
                <div class="title m-b-md">
                    Masa Berlaku {{ $user->trial_remaining }} Hari lagi
                </div>
            </div>
Saat diakses path “/status

Middleware

Saya sudah bisa menghitung jumlah sisa hari yang tersedia, sekarang adalah memanfaatkan informasi tersebut. Logika yang dibuat sederhana saja, jika trial periode tidak sama dengan “null” dan kurang dari 0 maka user akan diarahkan ke halaman yang memberitahukan bahwa dia harus upgrade status usernya.

Pertama mari buat middleware nya dulu

php artisan make:middleware TrialCheckMiddleware

Lalu isikan sebagai berikut di middlewarenya

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;

class TrialCheckMiddleware
{
    protected $auth;
    public function __construct(Auth $auth)
    {
        $this->auth = $auth;
    }

    public function handle($request, Closure $next)
    {
        
        $user = $this->auth->user();
        if(!is_null($user->trial_periode)) {
            $remaining = $user->trial_remaining;
            if($remaining < 0){
                abort('403','Masa trial berakhir, mohon upgrade akun anda');
            }
        }
        return $next($request);
    }
}

Daftarkan middleware di dalam “app/Http/Kernel.php”

protected $routeMiddleware = [
        ...other middleware
        'trial' => \App\Http\Middleware\TrialCheckMiddleware::class,
    ];

Selanjutnya gunakan middleware di dalam route

Route::get('/status', function () {
    $user = Auth::user();
    return view('status',compact('user'));
})->middleware('auth','trial');

Ubah tanggal di database ke tanggal kemarin misalnya dan kunjungi lagi halaman “/status”, jika berhasil akan muncul informasi sebagai berikut

Tambahan:

Jika setelah bikin middleware tidak ada efek bisa lakukan perintah clear cache di artisan.