Membuat Aplikasi Ekspedisi Lumen 6 #6: API Mengelola Armada

Membuat Aplikasi Ekspedisi Lumen 6 #6: API Mengelola Armada

Pendahuluan

Membuat API menggunakan Lumen dengan pokok pembahasan mengelola data armada akan menjadi konstrasi kita pada serial kali ini. Pendekatan yang sama akan kita gunakan dengan objek yang berbeda dan hal baru yang akan kita pelajari adalah bagaimana bersentuhan dengan File ketika membuat API.

Materi ini akan menuntun kita untuk berinteraksi lebih banyak tentang bagaimana cara membuat API dan menyelesaikan fitur atau module yang sedang kita hadapi. Berikut pembahasan bagaimana cara membuat aplikasi ekspedisi menggunakan Lumen.

Baca Juga: Membuat Aplikasi Ekspedisi NuxtJS #4: Manage Categories

API Get Data Armada

Metode yang digunakan tidak jauh berbeda dengan materi sebelumnya, buat file controller baru dengan nama FleetsController.php di dalam folder app/Http/Controllers dan tambahkan method index untuk meng-handle proses mengambil data armada.

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Fleet;

class FleetsController extends Controller
{
    public function index(Request $request)
    {
        //QUERY UNTUK MENGAMBIL DATA ARMADA DENGAN MENGURUTKAN BERDASARKAN CREATED_AT
        //DAN JIKA Q TIDAK KOSONG
        $fleets = Fleet::orderBy('created_at', 'DESC')->when($request->q, function($fleets) {
          //MAKA FUNGSI FILTER BERDASARKAN PLAT NOMOR AKAN DIJALANKAN
            $fleets->where('plate_number', $request->plate_number);
        })->paginate(10); //LOAD 10 DATA PERHALAMAN
        return response()->json(['status' => 'success', 'data' => $fleets]);
    }
    
}

Kemudian buat sebuah model baru bernama app/Fleet.php yang akan merujuk ke table fleets dimana table ini akan menyimpan seluruh data armada. Tambahkan code berikut

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Fleet extends Model
{
    protected $guarded = [];
}

Langkah berikutnya adalah mendefinisikan routing untuk method index di atas. Buka file routes/web.php dan tambahkan code berikut di dalam route group yang menggunakan middleware auth.

$router->get('fleets', 'FleetsController@index');

Lakukan uji coba pada postman dengan mengakses url /fleets dan hasil yang akan diperoleh terlihat seperti gambar berikut

membuat aplikasi ekspedisi lumen - api get armada

Add New & Upload Images

Fungsi selanjutnya yang akan kita kerjakan adalah fitur untuk menambahkan data armada beserta fungsi upload gambar dari masing-masing armada. Buka file FleetsController.php dan tambahkan method store().

public function store(Request $request)
{
    //MEMBUAT VALIDASI DATA YANG DITERIMA
    $this->validate($request, [
        'plate_number' => 'required|string|unique:fleets,plate_number', //HARUS BERSIFAT UNIK
        'type' => 'required',
        'photo' => 'required|image|mimes:jpg,jpeg,png' //FILE GAMBAR YG DIIZINKAN HANYA JPG,JPEG DAN PNG
    ]);

    $user = $request->user(); //MENGAMBIL USER YANG SEDANG LOGIN
    $file = $request->file('photo'); //MENGAMBIL FILE YANG DIUPLOAD
    //MEMBUAT NAMA BARU UNTUK FILE YANG AKAN DISIMPAN
    $filename = $request->plate_number . '-' . time() . '.' . $file->getClientOriginalExtension();
    //MEMINDAHKAN FILE YANG DITERIMA KE DALAM FOLDER PUBLIC/FLEETS DENGAN MENGGUNAKAN NAMA BARU YANG SUDAH DIBUAT
    $file->move('fleets', $filename);

    //SIMPAN INFORMASI DATA ARMADANYA KE TABLE FLEETS MELALUI MODEL FLEET
    Fleet::create([
        'plate_number' => $request->plate_number,
        'type' => $request->type,
        'photo' => $filename, //GUNAKAN NAMA FILE YANG SUDAH DIBUAT UNTUK MENGENALI GAMBAR
        'user_id' => $user->id
    ]);
    return response()->json(['status' => 'success']);
}

Cukup sederhana untuk metode penambahan data baru ini, karena hanya ada dua step dan step terakhir adalah mendefinisikan routing-nya. Buka kembali file routes/web.php dan tambahkan route

$router->post('fleets', 'FleetsController@store');

membuat aplikasi ekspedisi lumen - api upload images

Update Data Armada

Alur yang digunakan pada fitur ini adalah dengan mengambil data yang sudah ada, kemudian memperbaharui data tersebut dengan ketentuan bahwa file gambar boleh kosong. Sehingga, apabila file gambar kosong, maka data gambar tidak akan diperbaharui dan begitupun sebaliknya. Buka file FleetsController.php dan tambahkan kedua method berikut

public function edit($id)
{
    $fleet = Fleet::find($id); //MENGAMBIL DATA ARMADA BERDASARKAN ID
    return response()->json(['status' => 'success', 'data' => $fleet]); //KIRIMKAN RESPONSE DATA YANG DIMINTA
}

//FUNGSI UNTUK MEMPERBAHARUI DATA
public function update(Request $request, $id)
{
    //BUAT VALIDASI DATA YANG AKAN DIUPDATE
    $this->validate($request, [
        'plate_number' => 'required|string|unique:fleets,plate_number,' . $id, //UNIK KECUALI DATA YAGN SEDANG DIEDIT
        'type' => 'required',
        'photo' => 'nullable|image|mimes:jpg,jpeg,png' //GAMBAR BOLEH KOSONG
    ]);

    $fleet = Fleet::find($id); //AMBIL DATA BERDASARKAN ID
    $filename = $fleet->photo; //SIMPAN NAMA FILE GAMBAR YANG SEBELUMNYA
  
    //JIKA FILE GAMBARNYA INGIN DIPERBAHARUI
    if ($request->hasFile('photo')) {
        //MAKA LAKUKAN HAL SAMA SEPERTI SEBELUMNYA UNTUK MENYIMPAN FILE GAMBAR
        $file = $request->file('photo');
        $filename = $request->plate_number . '-' . time() . '.' . $file->getClientOriginalExtension();
        $file->move('fleets', $filename);

        File::delete(base_path('public/fleets/' . $fleet->photo)); //HAPUS GAMBAR YANG LAMA
    }
    //DAN PERBAHARUI DATANYA DI DATABASE
    $fleet->update([
        'plate_number' => $request->plate_number,
        'type' => $request->type,
        'photo' => $filename
    ]);
    return response()->json(['status' => 'success']);
}

Jangan lupa untuk menambahkan use statement

use Illuminate\Support\Facades\File;

Seperti biasanya, definisikan routing-nya agar kedua method diatas bisa digunakan. Buka file routes/web.php dan tambahkan route

$router->get('fleets/{id}', 'FleetsController@edit');
$router->put('fleets/{id}', 'FleetsController@update');

Kita juga perlu menyediakan url dari gambar setiap armada, maka dibutuhkan sebuah accessor untuk men-generate data baru ke dalam collection hasil query. Buka file Fleet.php dan tambahkan code berikut

protected $appends = ['photo_url'];

public function getPhotoUrlAttribute()
{
    return url('fleets/' . $this->photo);
}

Apabila kita get datanya, maka kita akan mendapatkan field baru yakni photo_url yang berisi sebuah url untuk gambar yang dituju.

membuat aplikasi ekspedisi lumen - api accessor images

Kamu juga bisa memperbaharui data dengan melakukan request yang menggunakan method POST, tapi di dalam body yang dikirimkan, terdapat field dengan value PUT.

membuat aplikasi ekspedisi lumen - api update armada

Hapus Data Armada

Fitur terakhir dari serial membuat aplikasi ekspedisi menggunakan Lumen dengan pembahasan mengelola armada adalah fungsi untuk menghapus data yang ada di database beserta file gambarnya. Buka kembali file FleetsController.php dan tambahkan code berikut

public function destroy($id)
{
    $fleet = Fleet::find($id); //AMBIL DATA BERDASARKAN ID
    File::delete(base_path('public/fleets/' . $fleet->photo)); //HAPUS FILE GAMBAR 
    $fleet->delete(); //HAPUS DATA DARI DATABASE
    return response()->json(['status' => 'success']);
}

Bagian terakhir, definisikan routing untuk menghapus data. Buka file routes/web.php

$router->delete('fleets/{id}', 'FleetsController@destroy');

membuat aplikasi ekspedisi lumen - api delete armada

Baca Juga: Membuat Aplikasi Ekspedisi Lumen 6 #5: Manage Category

Kesimpulan

Mengelola gambar, mengelola data armada, membuat API, membuat Accessor dan lain sebagainya menjadi pembahasan yang cukup seru pada materi di atas, sehingga dengan menyelesaikan materi ini, kamu telah belajar banyak hal sebagai modal untuk menyatukan kepingan-kepingan program menjadi sebuah aplikasi yang siap pakai.

Dokumentasi code dari artikel ini bisa dilihat di Github.

Category:
Share:

Comments