0% menganggap dokumen ini bermanfaat (0 suara)
134 tayangan58 halaman

Modul 2 Restful Api Backend Dengan JWT Dan Postman

Dokumen tersebut memberikan panduan lengkap tentang cara mengimplementasikan sistem otentikasi menggunakan JSON Web Token (JWT) pada backend RESTful API yang dibangun menggunakan Laravel dan PHP. Beberapa langkah yang dijelaskan meliputi instalasi JWT, konfigurasi model user, membuat controller untuk login dan logout, serta merouterkan endpoint-endpoint terkait.
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
134 tayangan58 halaman

Modul 2 Restful Api Backend Dengan JWT Dan Postman

Dokumen tersebut memberikan panduan lengkap tentang cara mengimplementasikan sistem otentikasi menggunakan JSON Web Token (JWT) pada backend RESTful API yang dibangun menggunakan Laravel dan PHP. Beberapa langkah yang dijelaskan meliputi instalasi JWT, konfigurasi model user, membuat controller untuk login dan logout, serta merouterkan endpoint-endpoint terkait.
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 58

RESTFUL API BACKEND

Json Web Token


Pengertian JWT
" Belajar Course jangan sering nonton video, selingkan waktu kamu untuk
mempraktekkan course yang kamu pelajari

- Muhammad Fauzi

Dikutip dari laman official nya, JSON Web Token atau biasa disebut
dengan JWT adalah standar terbuka (RFC 7519) yang mendefinisikan cara untuk
mentransmisikan informasi dengan aman antar pihak sebagai objek JSON.

Informasi ini dapat diverifikasi dan dipercaya karena ditandatangani secara digital.
JWT dapat ditandatangani menggunakan sebuah secreet (dengan algoritma HMAC)
atau pasangan kunci publik / pribadi menggunakan RSA atau ECDSA.
(https://jwt.io/introduction/).

Sederhananya JWT merupakan Web Token yang berupa JSON dan umumnya
digunakan untuk proses authentication. Dimana untuk mendapatkan suatu data di
dalam server kita harus menyertakan token tersebut sebagai kuncinya.

Installasi JWT
{warning} Catatan: Proses installasi membutuhkan koneksi internet!

Silahkan kalian jalankan perintah berikut ini di dalam terminal/CMD/Git dan tentunya
berada di dalam direktori project yang sedang kita kerjakan.
composer require php-open-source-saver/jwt-auth:1.4.2

Jika sudah selesai maka akan ditandai dengan informasi seperti pada gambar di
bawah ini :
Publish JWT
Setelah proses installasi selesai, sekarang silahkan lakukan publish file konfigurasi.
Dengan menJalankan perintah berikut ini di dalam terminal/CMD/Git:
php artisan vendor:publish --
provider="PHPOpenSourceSaver\JWTAuth\Providers\LaravelServiceProvider"

Proses konfigurasi publish jika sudah selesai maka akan ditandai dengan informasi
seperti pada gambar di bawah ini:
Generate Screet Key
Silahkan jalankan perintah di bawah ini di terminal/CMD untuk membuat secret
key di JWT :
php artisan jwt:secret

Jika sudah selesai maka akan di tandai dengan informasi seperti pada gambar di
bawah ini:

Update Guard API


Secara default untuk Guard api di Laravel menggunakan driver token, oleh sebab itu
kita harus melakukan perubahan terlebih dahulu ke dalam JWT atau Json Web
Token.

Silahkan buka file config/auth.php kemudian cari kode berikut ini :


'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',

],
],

Kemudian silahkan kalian ganti menjadi seperti berikut ini


'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',

],

'api' => [
'driver' => 'jwt',
// <-- set ke "jwt"
'provider' => 'users',
'hash' => false,
],
],

Sehingga file auth.php secara keseluruhan akan menjadi seperti berikut ini :
<?php

return [

'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',

],

'api' => [
'driver' => 'jwt',
'provider' => 'users',
'hash' => false,
],
],

'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],

],

'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
],

'password_timeout' => 10800,

];
Konfigurasi Model User
Sekarang, kita lanjutkan untuk melakukan beberapa konfigurasi di dalam
Model User agar bisa menggunakan JWT untuk generate token.

Silahkan buka file app/Models/User.php kemudian rubah kode-nya menjadi seperti


berikut ini :
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject; // <-- import JWTSubject

class User extends Authenticatable implements JWTSubject // <-- tambahkan ini


{
use HasApiTokens, HasFactory, Notifiable;

/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];

/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];

/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];

/**
* posts
*
* @return void
*/
public function posts()
{
return $this->hasMany(Post::class);
}

/**
* getJWTIdentifier
*
* @return void
*/
public function getJWTIdentifier()
{
return $this->getKey();
}

/**
* getJWTCustomClaims
*
* @return void
*/
public function getJWTCustomClaims()
{
return [];
}
}

Sampai pada langkah ini, kita berhasil melakukan konfigurasi JWT dengan benar,
adapun untuk testing akan kita lanjutkan pada sesi berikutnya, semangat .
Auth API
Controller API Login
Sekarang kita akan mulai dengan membuat controller-nya terlebih dahulu, silahkan
jalankan perintah berikut ini di dalam terminal/CMD :
php artisan make:controller Api/Admin/LoginController

Perintah di atas akan digunakan untuk membuat controller baru dengan


nama LoginController yang berada di dalam folder app/Http/Controllers/Api/Admin/ .
Dan ditandai dengan informasi seperti pada gambar dibawah ini :

Sekarang buka file tersebut kemudian rubah kode-nya menjadi seperti berikut ini :
<?php

namespace App\Http\Controllers\Api\Admin;

use Illuminate\Http\Request;
use PHPOpenSourceSaver\JWTAuth\Facades\JWTAuth;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;

class LoginController extends Controller


{
/**
* index
*
* @param mixed $request
* @return void
*/
public function index(Request $request)
{
//set validasi
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required',
]);

//response error validasi


if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//get "email" dan "password" dari input


$credentials = $request->only('email', 'password');

//check jika "email" dan "password" tidak sesuai


if(!$token = auth()->guard('api')->attempt($credentials)) {

//response login "failed"


return response()->json([
'success' => false,
'message' => 'Email or Password is incorrect'
], 401);

//response login "success" dengan generate "Token"


return response()->json([
'success' => true,
'user' => auth()->guard('api')->user(),
'token' => $token
], 200);
}

/**
* getUser
*
* @return void
*/
public function getUser()
{
//response data "user" yang sedang login
return response()->json([
'success' => true,
'user' => auth()->guard('api')->user()
], 200);
}

/**
* Refresh a token.
*
* @return \Illuminate\Http\JsonResponse
*/
public function refreshToken(Request $request)
{
//refresh "token"
$refreshToken = JWTAuth::refresh(JWTAuth::getToken());

//set user dengan "token" baru


$user = JWTAuth::setToken($refreshToken)->toUser();

//set header "Authorization" dengan type Bearer + "token" baru


$request->headers->set('Authorization','Bearer '.$refreshToken);

//response data "user" dengan "token" baru


return response()->json([
'success' => true,
'user' => $user,
'token' => $refreshToken,
], 200);
}

/**
* logout
*
* @return void
*/
public function logout()
{
//remove "token" JWT
$removeToken = JWTAuth::invalidate(JWTAuth::getToken());

//response "success" logout


return response()->json([
'success' => true,
], 200);

}
}

Route Login
Setelah berhasil membuat controller dan menambahkan method-method di
dalamnya, maka sekarang kita lanjutkan untuk membuat route agar method-
method tersebut dapat digunakan di gunakan oleh aplikasi lain atau sering dikenal
dengan URL Design yang sudah kita bahas di awal bab.

Silahkan buka file routes/api.php kemudian ubah kode-nya menjadi seperti berikut
ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});

});

Dari routes di atas kita berhasil membuat url design sebagai berikut :
1. http://localhost:8000/api/admin/login
2. http://localhost:8000/api/admin/user
3. http://localhost:8000/api/admin/refresh
4. http://localhost:8000/api/admin/logout

Categories API
Resources API Categories
Pertama kita akan membuat sebuah Resource terlebih dahulu, yang mana akan di
gunakan untuk mentransformasi Model Category ke dalam format JSON yang lebih
baik dan cepat. Silahkan kalian jalankan perintah berikut ini di dalam terminal/CMD
dan yang pasti di dalam project Laravel :
php artisan make:resource CategoryResource

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Resources/ dengan file yang bernama CategoryResource.php.
Silahkan kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class CategoryResource extends JsonResource


{

public $status;
public $message;

/**
* __construct
*
* @param mixed $status
* @param mixed $message
* @param mixed $resource
* @return void
*/
public function __construct($status, $message, $resource)
{
parent::__construct($resource);
$this->status = $status;
$this->message = $message;
}
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'success' => $this->status,
'message' => $this->message,
'data' => $this->resource
];
}
}

Controller API Categories


Setelah kita berhasil membuat Resource, makan kita lanjutkan untuk
membuat controller dengan nama CategoryController, Silahkan jalankan perintah di
bawah ini kedalam command prompt
php artisan make:controller Api/Admin/CategoryController

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Https/Controllers/Api/Admin/ dengan file yang
bernama CategoryController.php. Silahkan kalian buka file tersebut, kemudian
sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Controllers\Api\Admin;

use App\Models\Category;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
use App\Http\Resources\CategoryResource;
use Illuminate\Support\Facades\Validator;

class CategoryController extends Controller


{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//get categories
$categories = Category::when(request()->q, function($categories) {
$categories = $categories->where('name', 'like', '%'. request()->q .
'%');
})->latest()->paginate(5);

//return with Api Resource


return new CategoryResource(true, 'List Data Categories', $categories);
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'image' => 'required|image|mimes:jpeg,jpg,png|max:2000',
'name' => 'required|unique:categories',
]);

if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//upload image
$image = $request->file('image');
$image->storeAs('public/categories', $image->hashName());

//create category
$category = Category::create([
'image'=> $image->hashName(),
'name' => $request->name,
'slug' => Str::slug($request->name, '-'),
]);

if($category) {
//return success with Api Resource
return new CategoryResource(true, 'Data Category Berhasil Disimpan!',
$category);
}

//return failed with Api Resource


return new CategoryResource(false, 'Data Category Gagal Disimpan!', null);
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$category = Category::whereId($id)->first();

if($category) {
//return success with Api Resource
return new CategoryResource(true, 'Detail Data Category!', $category);
}

//return failed with Api Resource


return new CategoryResource(false, 'Detail Data Category Tidak
DItemukan!', null);
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Category $category)
{
$validator = Validator::make($request->all(), [
'name' => 'required|unique:categories,name,'.$category->id,
]);

if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//check image update


if ($request->file('image')) {

//remove old image


Storage::disk('local')-
>delete('public/categories/'.basename($category->image));

//upload new image


$image = $request->file('image');
$image->storeAs('public/categories', $image->hashName());

//update category with new image


$category->update([
'image'=> $image->hashName(),
'name' => $request->name,
'slug' => Str::slug($request->name, '-'),
]);

//update category without image


$category->update([
'name' => $request->name,
'slug' => Str::slug($request->name, '-'),
]);

if($category) {
//return success with Api Resource
return new CategoryResource(true, 'Data Category Berhasil Diupdate!',
$category);
}

//return failed with Api Resource


return new CategoryResource(false, 'Data Category Gagal Diupdate!', null);
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Category $category)
{
//remove image
Storage::disk('local')->delete('public/categories/'.basename($category-
>image));

if($category->delete()) {
//return success with Api Resource
return new CategoryResource(true, 'Data Category Berhasil Dihapus!',
null);
}

//return failed with Api Resource


return new CategoryResource(false, 'Data Category Gagal Dihapus!', null);
}
}

Controller tersebut dapat digunakan untuk


proses CRUD atau Create, Read, Update dan Delete, tapi didalam laravel istilah itu
sedikit berbeda seperti pada penjelasan dibawah ini

Function keterangan

index menampilkan list data category dari database

store menyimpan data ke dalam database

show menampilkan data category berdasarkan ID yang di dapatkan dari parameter URL

update update data category ke dalam database berdasarkan ID

destroy Menghapus data dari database berdasarkan ID

Route Categories
Setelah berhasil membuat controller dan beberapa method di dalamnya, sekarang
kita lanjutkan untuk membuat route agar controller dan method tersebut dapat
digunakan. Silahkan buka file routes/api.php kemudian tambahkan route di bawah
ini di dalam prefix admin dan group middleware auth:api dan tepatnya di
bawah route user. Maka secara keseluruhan akan menjadi seperti di bawah ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);

});

Dari routes di atas kita berhasil membuat url design sebagai berikut :

1. http://localhost:8000/api/admin/categories

Url endpoint di atas bisa di gunakan sebagai API untuk di konsumsi oleh platform
lainnya. Pada langkah selanjutnya kita akan melakukan uji coba pada api yang
sudah kita buat menggunakan aplikasi postman.
Posts API
Resources API Posts
Seperti pada RESTFUL API CATEGORIES, Sekarang kita akan
membuat Resource yang akan digunakan untuk mengubah Model ke
dalam format JSON. Silahkan jalankan perintah berikut ini di dalam terminal/CMD :
php artisan make:resource PostResource

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Resources/ dengan file yang bernama PostResource.php. Silahkan
kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PostResource extends JsonResource


{
public $status;
public $message;

/**
* __construct
*
* @param mixed $status
* @param mixed $message
* @param mixed $resource
* @return void
*/
public function __construct($status, $message, $resource)
{
parent::__construct($resource);
$this->status = $status;
$this->message = $message;
}

/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'success' => $this->status,
'message' => $this->message,
'data' => $this->resource
];
}
}

Controller API Categories


Setelah berhasil membuat PostResource sekarang kita lanjutkan
membuat controller untuk Rest API-nya. Silahkan jalankan perintah berikut ini di
dalam terminal/CMD :
php artisan make:controller Api/Admin/PostController

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Controllers/Api/Admin/ dengan file yang
bernama PostController.php. Silahkan kalian buka file tersebut, kemudian sesuaikan
menjadi seperti dibawah ini :
<?php

namespace App\Http\Controllers\Api\Admin;

use App\Models\Post;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\PostResource;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class PostController extends Controller


{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$posts = Post::with('user', 'category', 'comments')->when(request()->q,
function($posts) {
$posts = $posts->where('title', 'like', '%'. request()->q . '%');
})->latest()->paginate(5);

//return with Api Resource


return new PostResource(true, 'List Data Posts', $posts);
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'image' => 'required|image|mimes:jpeg,jpg,png|max:2000',
'title' => 'required|unique:posts',
'category_id' => 'required',
'content' => 'required',
'description' => 'required'
]);

if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//upload image
$image = $request->file('image');
$image->storeAs('public/posts', $image->hashName());

$post = Post::create([
'image' => $image->hashName(),
'title' => $request->title,
'slug' => Str::slug($request->title, '-'),
'category_id' => $request->category_id,
'user_id' => auth()->guard('api')->user()->id,
'content' => $request->content,
'description' => $request->description
]);

$post->save();

if($post) {
//return success with Api Resource
return new PostResource(true, 'Data Post Berhasil Disimpan!', $post);
}

//return failed with Api Resource


return new PostResource(false, 'Data Post Gagal Disimpan!', null);
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$post = Post::with('category')->whereId($id)->first();

if($post) {
//return success with Api Resource
return new PostResource(true, 'Detail Data Post!', $post);
}
//return failed with Api Resource
return new PostResource(false, 'Detail Data Post Tidak DItemukan!', null);
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Post $post)
{
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts,title,'.$post->id,
'category_id' => 'required',
'content' => 'required',
'description' => 'required'
]);

if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//check image update


if ($request->file('image')) {

//remove old image


Storage::disk('local')->delete('public/posts/'.basename($post-
>image));

//upload new image


$image = $request->file('image');
$image->storeAs('public/posts', $image->hashName());

$post->update([
'image' => $image->hashName(),
'title' => $request->title,
'slug' => Str::slug($request->title, '-'),
'category_id' => $request->category_id,
'user_id' => auth()->guard('api')->user()->id,
'content' => $request->content,
'description' => $request->description
]);

$post->update([
'title' => $request->title,
'slug' => Str::slug($request->title, '-'),
'category_id' => $request->category_id,
'user_id' => auth()->guard('api')->user()->id,
'content' => $request->content,
'description' => $request->description
]);

$post->save();
if($post) {
//return success with Api Resource
return new PostResource(true, 'Data Post Berhasil Diupdate!', $post);
}

//return failed with Api Resource


return new PostResource(false, 'Data Post Gagal Disupdate!', null);
}

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

//remove image
Storage::disk('local')->delete('public/posts/'.basename($post->image));

if($post->delete()) {
//return success with Api Resource
return new PostResource(true, 'Data Post Berhasil Dihapus!', null);
}

//return failed with Api Resource


return new PostResource(false, 'Data Post Gagal Dihapus!', null);
}
}

Seperti pada penjelasan sebelumnya, Controller tersebut dapat digunakan untuk


proses CRUD atau Create, Read, Update dan Delete, dengan masing-masing
keterangan seperti dibawah ini :

Function keterangan

index menampilkan list data posts dari database

store menyimpan data post ke dalam database

show menampilkan data post berdasarkan ID yang di dapatkan dari parameter URL

update update data post ke dalam database berdasarkan ID

destroy
Menghapus data post dari database berdasarkan ID
Route Posts
Setelah berhasil membuat Resource dan controller beserta method-method di
dalamnya, maka sekarang kita lanjutkan untuk
membuatkan route untuk controller tersebut.

Silahkan buka file routes/api.php kemudian tambahkan route berikut ini di


dalam prefix admin dan group middleware auth:api dan tepatnya di
bawah route categories. Maka seacara keseluruhan akan menjadi seperti dibawah
ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);
//Poss
Route::apiResource('/posts',
App\Http\Controllers\Api\Admin\PostController::class);
});
Users API
Resources API Users
Pertama tentu saja kita akan membuat sebuah Resource terlebih dahulu, yang
mana akan difungsikan untuk melakukan transformasi dari Model menjadi
sebuah response dengan format JSON. Silahkan jalankan perintah berikut ini di
dalam terminal/CMD :
php artisan make:resource UserResource

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Resources/ dengan file yang bernama UserResource.php. Silahkan
kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :

Controller API Users


Setelah berhasil membuat sebuah Resource, sekarang kita lanjutkan untuk
membuat controller beserta method-method di dalamnya, yang mana akan
digunakan untuk membuat Rest API CRUD data users. Silahkan jalankan
terminal/CMD untuk melakukan generate controller baru dengan command line
seperti dibawah ini :
php artisan make:controller Api/Admin/UserController

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Controllers/Api/Admin/ dengan file yang
bernama UserController.php. Silahkan kalian buka file tersebut, kemudian sesuaikan
menjadi seperti dibawah ini :
<?php

namespace App\Http\Controllers\Api\Admin;

use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use Illuminate\Support\Facades\Validator;
class UserController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//get users
$users = User::when(request()->q, function($users) {
$users = $users->where('name', 'like', '%'. request()->q . '%');
})->latest()->paginate(5);

//return with Api Resource


return new UserResource(true, 'List Data Users', $users);
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|unique:users',
'password' => 'required'
]);

if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//create user
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
]);

if($user) {
//return success with Api Resource
return new UserResource(true, 'Data User Berhasil Disimpan!', $user);
}

//return failed with Api Resource


return new UserResource(false, 'Data User Gagal Disimpan!', null);
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$user = User::whereId($id)->first();

if($user) {
//return success with Api Resource
return new UserResource(true, 'Detail Data User!', $user);
}

//return failed with Api Resource


return new UserResource(false, 'Detail Data User Tidak DItemukan!', null);
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, User $user)
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|unique:users,email,'.$user->id,
]);

if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

if($request->password == "") {

//update user without password


$user->update([
'name' => $request->name,
'email' => $request->email,
]);

//update user with new password


$user->update([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
]);

if($user) {
//return success with Api Resource
return new UserResource(true, 'Data User Berhasil Diupdate!', $user);
}

//return failed with Api Resource


return new UserResource(false, 'Data User Gagal Diupdate!', null);
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(User $user)
{
if($user->delete()) {
//return success with Api Resource
return new UserResource(true, 'Data User Berhasil Dihapus!', null);
}

//return failed with Api Resource


return new UserResource(false, 'Data User Gagal Dihapus!', null);
}
}

Seperti pada penjelasan sebelumnya, Controller tersebut dapat digunakan untuk


proses CRUD atau Create, Read, Update dan Delete, dengan masing-masing
keterangan seperti dibawah ini :

Function keterangan

index
menampilkan list data users dari database

store menyimpan data user ke dalam database

show menampilkan data user berdasarkan ID yang di dapatkan dari parameter URL

update update data user ke dalam database berdasarkan ID

destroy Menghapus data user dari database berdasarkan ID

Route Users
Setelah berhasil membuat Resource dan controller beserta method-method di
dalamnya, maka sekarang kita lanjutkan untuk
membuatkan route untuk controller tersebut.

Silahkan buka file routes/api.php kemudian tambahkan route berikut ini di


dalam prefix admin dan group middleware auth:api dan tepatnya di
bawah route posts. Maka secara keseluruhan akan menjadi seperti dibawah ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {
//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);
//Poss
Route::apiResource('/posts',
App\Http\Controllers\Api\Admin\PostController::class);
//Users
Route::apiResource('/users',
App\Http\Controllers\Api\Admin\UserController::class);
});

Dari routes di atas kita berhasil membuat url design sebagai berikut :

1. http://localhost:8000/api/admin/users

Url endpoint diatas bisa gunakan sebagai API untuk digunakan ke dalam platform
lainnya. Pada langkah selanjutnya kita akan melakukan uji coba pada API yang
sudah kita buat menggunakan aplikasi postman.
Saran API
Resources API Saran
Pertama kita akan membuat sebuah Resource terlebih dahulu, yang mana akan di
gunakan untuk mentransformasi Model Saran ke dalam format JSON yang lebih baik
dan cepat. Silahkan kalian jalankan perintah berikut ini di dalam terminal/CMD dan
yang pasti di dalam project Laravel :
php artisan make:resource SaranResource

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Resources/ dengan file yang bernama SaranResource.php. Silahkan
kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class SaranResource extends JsonResource


{
//define properti
public $status;
public $message;

/**
* __construct
*
* @param mixed $status
* @param mixed $message
* @param mixed $resource
* @return void
*/
public function __construct($status, $message, $resource)
{
parent::__construct($resource);
$this->status = $status;
$this->message = $message;
}

/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'success' => $this->status,
'message' => $this->message,
'data' => $this->resource
];
}
}

Controller API Saran


Setelah kita berhasil membuat Resource, makan kita lanjutkan untuk
membuat controller dengan nama CategoryController, Silahkan jalankan perintah di
bawah ini kedalam command prompt
php artisan make:controller Api/SaranController

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Https/Controllers/Api/ dengan file yang bernama SaranController.php.
Silahkan kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Controllers\Api;

use App\Models\Saran;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\SaranResource;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class SaranController extends Controller


{
/**
* index
*
* @return void
*/
public function index()
{
//get posts
$sarans = Saran::skip(0)->take(3)->get();

//return collection of posts as a resource


return new SaranResource(true, 'List Data Posts', $sarans);
}

/**
* store
*
* @param mixed $request
* @return void
*/
public function store(Request $request)
{
//define validation rules
$validator = Validator::make($request->all(), [
'name' => 'required',
'content' => 'required',
]);
//check if validation fails
if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//upload image

//create post
$sarans = Saran::create([
'name' => $request->name,
'content' => $request->content,
]);

//return response
return new SaranResource(true, 'Data Post Berhasil Ditambahkan!',
$sarans);
}

/**
* show
*
* @param mixed $post
* @return void
*/
public function show(Saran $saran)
{
//return single post as a resource
return new SaranResource(true, 'Data Post Ditemukan!', $saran);
}

/**
* update
*
* @param mixed $request
* @param mixed $post
* @return void
*/

public function destroy(Saran $saran)


{
//delete image

//delete post
$saran->delete();

//return response
return new SaranResource(true, 'Data Post Berhasil Dihapus!', null);
}
}

Controller tersebut dapat digunakan untuk


proses CRUD atau Create, Read, Update dan Delete, tapi didalam laravel istilah itu
sedikit berbeda seperti pada penjelasan dibawah ini
Function keterangan

index menampilkan list data saran dari database

store menyimpan data ke dalam database

menampilkan data saran berdasarkan ID yang di dapatkan dari


show
parameter URL

update update data saran ke dalam database berdasarkan ID

destroy Menghapus data saran dari database berdasarkan ID

Route Saran
Setelah berhasil membuat controller dan beberapa method di dalamnya, sekarang
kita lanjutkan untuk membuat route agar controller dan method tersebut dapat
digunakan. Silahkan buka file routes/api.php kemudian tambahkan route di bawah
ini di dalam prefix admin dan group middleware auth:api dan tepatnya di
bawah route users. Maka secara keseluruhan akan menjadi seperti di bawah ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);
//Route Post
Route::apiResource('/posts',
App\Http\Controllers\Api\Admin\PostController::class);
//Users
Route::apiResource('/users',
App\Http\Controllers\Api\Admin\UserController::class);
//Route Saran
Route::apiResource('/saran', App\Http\Controllers\Api\SaranController::class);

});

Dari routes di atas kita berhasil membuat url design sebagai berikut :

1. http://localhost:8000/api/saran

Url endpoint di atas bisa di gunakan sebagai API untuk di konsumsi oleh platform
lainnya. Pada langkah selanjutnya kita akan melakukan uji coba pada api yang
sudah kita buat menggunakan aplikasi postman.
Profil API
Resources API Profil
Pertama kita akan membuat sebuah Resource terlebih dahulu, yang mana akan di
gunakan untuk mentransformasi Model Profil ke dalam format JSON yang lebih
baik dan cepat. Silahkan kalian jalankan perintah berikut ini di dalam terminal/CMD
dan yang pasti di dalam project Laravel :
php artisan make:resource ProfilResource

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Resources/ dengan file yang bernama ProfilResource.php. Silahkan
kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ProfilResource extends JsonResource


{
//define properti
public $status;
public $message;

/**
* __construct
*
* @param mixed $status
* @param mixed $message
* @param mixed $resource
* @return void
*/
public function __construct($status, $message, $resource)
{
parent::__construct($resource);
$this->status = $status;
$this->message = $message;
}

/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'success' => $this->status,
'message' => $this->message,
'data' => $this->resource
];
}
}

Controller API Profil


Setelah kita berhasil membuat Resource, makan kita lanjutkan untuk
membuat controller dengan nama CategoryController, Silahkan jalankan perintah di
bawah ini kedalam command prompt
php artisan make:controller Api/ProfilController

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Https/Controllers/Api/ dengan file yang bernama ProfilController.php.
Silahkan kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Controllers\Api;

use App\Models\Profil;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\ProfilResource;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class ProfilController extends Controller


{
/**
* index
*
* @return void
*/
public function index()
{
//get posts
$profils = Profil::skip(0)->take(3)->get();

//return collection of posts as a resource


return new ProfilResource(true, 'List Data Posts', $profils);
}

/**
* store
*
* @param mixed $request
* @return void
*/
public function store(Request $request)
{
//define validation rules
$validator = Validator::make($request->all(), [
'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'title' => 'required',
'content' => 'required',
]);

//check if validation fails


if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//upload image
$image = $request->file('image');
$image->storeAs('public/profils', $image->hashName());

//create post
$profils = Profil::create([
'image' => $image->hashName(),
'title' => $request->title,
'content' => $request->content,
]);

if($profils) {
//return success with Api Resource
return new ProfilResource(true, 'Data Category Berhasil Disimpan!',
$profils);
}

//return failed with Api Resource


return new ProfilResource(false, 'Data Category Gagal Disimpan!', null);
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$profiles = Profil::whereId($id)->first();

if($profiles) {
//return success with Api Resource
return new ProfilResource(true, 'Detail Data Category!', $profiles);
}

//return failed with Api Resource


return new ProfilResource(false, 'Detail Data Category Tidak DItemukan!',
null);
}

/**
* update
*
* @param mixed $request
* @param mixed $post
* @return void
*/
public function update(Request $request, Profil $profile)
{
//define validation rules
$validator = Validator::make($request->all(), [
'title' => 'required',
'content' => 'required',
]);

//check if validation fails


if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//check if image is not empty


if ($request->hasFile('image')) {

//upload image
$image = $request->file('image');
$image->storeAs('public/profils', $image->hashName());

//delete old image


Storage::delete('public/profils/'.$profile->image);

//update post with new image


$profile->update([
'image' => $image->hashName(),
'title' => $request->title,
'content' => $request->content,
]);

} else {

//update post without image


$profile->update([
'title' => $request->title,
'content' => $request->content,
]);
}

//return response
return new ProfilResource(true, 'Data Home Berhasil Diubah!', $profile);
}

/**
* destroy
*
* @param mixed $post
* @return void
*/
public function destroy(Profil $profile)
{
//delete image
Storage::delete('public/profils/'.$profile->image);

//delete post
$profile->delete();

//return response
return new ProfilResource(true, 'Data Post Berhasil Dihapus!', null);
}
}
Controller tersebut dapat digunakan untuk
proses CRUD atau Create, Read, Update dan Delete, tapi didalam laravel istilah itu
sedikit berbeda seperti pada penjelasan dibawah ini

Function keterangan

index menampilkan list data profil dari database

store menyimpan data ke dalam database

show menampilkan data profil berdasarkan ID yang di dapatkan dari parameter URL

update update data profil ke dalam database berdasarkan ID

destroy Menghapus data profil dari database berdasarkan ID

Route Profil
Setelah berhasil membuat controller dan beberapa method di dalamnya, sekarang
kita lanjutkan untuk membuat route agar controller dan method tersebut dapat
digunakan. Silahkan buka file routes/api.php kemudian tambahkan route di bawah
ini di dalam prefix admin dan group middleware auth:api dan tepatnya di
bawah route profil. Maka secara keseluruhan akan menjadi seperti di bawah ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);
});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);
//Route Post
Route::apiResource('/posts',
App\Http\Controllers\Api\Admin\PostController::class);
//Users
Route::apiResource('/users',
App\Http\Controllers\Api\Admin\UserController::class);
//Route Saran
Route::apiResource('/saran', App\Http\Controllers\Api\SaranController::class);
//Route Profil
Route::apiResource('/profile',
App\Http\Controllers\Api\SaranController::class);

});

Dari routes di atas kita berhasil membuat url design sebagai berikut :

1. http://localhost:8000/api/profile

Url endpoint di atas bisa di gunakan sebagai API untuk di konsumsi oleh platform
lainnya. Pada langkah selanjutnya kita akan melakukan uji coba pada api yang
sudah kita buat menggunakan aplikasi postman.
Informasi API
Resources API Informasi
Pertama kita akan membuat sebuah Resource terlebih dahulu, yang mana akan di
gunakan untuk mentransformasi Model Informasi yang sudah di buat sebelumnya ke
dalam bentuk format JSON yang lebih baik dan cepat. Silahkan kalian jalankan
perintah berikut ini di dalam terminal/CMD dan yang pasti di dalam project Laravel :
php artisan make:resource InformasiResource

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Resources/ dengan file yang bernama InformasiResource.php.
Silahkan kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class InformasiResource extends JsonResource


{
//define properti
public $status;
public $message;

/**
* __construct
*
* @param mixed $status
* @param mixed $message
* @param mixed $resource
* @return void
*/
public function __construct($status, $message, $resource)
{
parent::__construct($resource);
$this->status = $status;
$this->message = $message;
}

/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'success' => $this->status,
'message' => $this->message,
'data' => $this->resource
];
}
}

Controller API Profil


Setelah kita berhasil membuat Resource, makan kita lanjutkan untuk
membuat controller dengan nama InformasiController, Silahkan jalankan perintah di
bawah ini kedalam command prompt
php artisan make:controller Api/InformasiController

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Https/Controllers/Api/ dengan file yang
bernama InformasiController.php. Silahkan kalian buka file tersebut, kemudian
sesuaikan menjadi seperti di bawah ini :
<?php

namespace App\Http\Controllers\Api;

use App\Models\Informasi;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\InformasiResource;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class InformasiController extends Controller


{
/**
* index
*
* @return void
*/
public function index()
{
//get posts
$informasis = Informasi::skip(0)->take(3)->get();

//return collection of posts as a resource


return new InformasiResource(true, 'List Data Posts', $informasis);
}

/**
* store
*
* @param mixed $request
* @return void
*/
public function store(Request $request)
{
//define validation rules
$validator = Validator::make($request->all(), [
'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'title' => 'required',
'content' => 'required',
]);

//check if validation fails


if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//upload image
$image = $request->file('image');
$image->storeAs('public/informasi', $image->hashName());

//create post
$informasis = Informasi::create([
'image' => $image->hashName(),
'title' => $request->title,
'content' => $request->content,
]);

//return response
return new InformasiResource(true, 'Data Post Berhasil Ditambahkan!',
$informasis);
}

/**
* show
*
* @param mixed $post
* @return void
*/
public function show(Informasi $info)
{
//return single post as a resource
return new InformasiResource(true, 'Data Post Ditemukan!', $info);
}

/**
* update
*
* @param mixed $request
* @param mixed $post
* @return void
*/
public function update(Request $request, Informasi $info)
{
//define validation rules
$validator = Validator::make($request->all(), [
'title' => 'required',
'content' => 'required',
]);

//check if validation fails


if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//check if image is not empty


if ($request->hasFile('image')) {

//upload image
$image = $request->file('image');
$image->storeAs('public/informasi', $image->hashName());

//delete old image


Storage::delete('public/informasi/'.$info->image);

//update post with new image


$info->update([
'image' => $image->hashName(),
'title' => $request->title,
'content' => $request->content,
]);

} else {

//update post without image


$info->update([
'title' => $request->title,
'content' => $request->content,
]);
}

//return response
return new InformasiResource(true, 'Data Home Berhasil Diubah!', $info);
}

/**
* destroy
*
* @param mixed $post
* @return void
*/
public function destroy(Informasi $info)
{
//delete image
Storage::delete('public/informasi/'.$info->image);

//delete post
$info->delete();

//return response
return new InformasiResource(true, 'Data Post Berhasil Dihapus!', null);
}
}
Controller tersebut dapat digunakan untuk
proses CRUD atau Create, Read, Update dan Delete, tapi didalam laravel istilah itu
sedikit berbeda seperti pada penjelasan dibawah ini

Function keterangan

index menampilkan list data informasi dari database

store menyimpan data informasi ke dalam database

menampilkan data informasi berdasarkan ID yang di dapatkan dari


show
parameter URL

update update data informasi ke dalam database berdasarkan ID

destroy Menghapus data informasi dari database berdasarkan ID

Route Informasi
Setelah berhasil membuat controller dan beberapa method di dalamnya, sekarang
kita lanjutkan untuk membuat route agar controller dan method tersebut dapat
digunakan. Silahkan buka file routes/api.php kemudian tambahkan route di bawah
ini di dalam prefix admin dan group middleware auth:api dan tepatnya di
bawah route profil. Maka secara keseluruhan akan menjadi seperti di bawah ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);
//Route Post
Route::apiResource('/posts',
App\Http\Controllers\Api\Admin\PostController::class);
//Users
Route::apiResource('/users',
App\Http\Controllers\Api\Admin\UserController::class);
//Route Saran
Route::apiResource('/saran', App\Http\Controllers\Api\SaranController::class);
//Route Profil
Route::apiResource('/profile',
App\Http\Controllers\Api\SaranController::class);
//Route Informasi
Route::apiResource('/info',
App\Http\Controllers\Api\InformasiController::class);

});

Dari routes di atas kita berhasil membuat url design sebagai berikut :

1. http://localhost:8000/api/info

Url endpoint di atas bisa di gunakan sebagai API untuk di konsumsi oleh platform
lainnya. Pada langkah selanjutnya kita akan melakukan uji coba pada api yang
sudah kita buat menggunakan aplikasi postman.
Statistik API
Resources API Statistik
Pertama kita akan membuat sebuah Resource terlebih dahulu, yang mana akan di
gunakan untuk mentransformasi Model Statistik yang sudah di buat sebelumnya ke
dalam bentuk format JSON yang lebih baik dan cepat. Silahkan kalian jalankan
perintah berikut ini di dalam terminal/CMD dan yang pasti di dalam project Laravel :
php artisan make:resource StatistikResource

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Http/Resources/ dengan file yang bernama StatistikResource.php.
Silahkan kalian buka file tersebut, kemudian sesuaikan menjadi seperti dibawah ini :
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class StatistikResource extends JsonResource


{
//define properti
public $status;
public $message;

/**
* __construct
*
* @param mixed $status
* @param mixed $message
* @param mixed $resource
* @return void
*/
public function __construct($status, $message, $resource)
{
parent::__construct($resource);
$this->status = $status;
$this->message = $message;
}

/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'success' => $this->status,
'message' => $this->message,
'data' => $this->resource
];
}
}

Controller API Statistik


Setelah kita berhasil membuat Resource, makan kita lanjutkan untuk
membuat controller dengan nama StatistikController, Silahkan jalankan perintah di
bawah ini kedalam command prompt
php artisan make:controller Api/StatistikController

Jika sudah mendapatkan informasi seperti gambar di atas, maka secara otomatis
kita mendapatkan file baru yang terletak di dalam
direktori app/Https/Controllers/Api/ dengan file yang
bernama StatistikController.php. Silahkan kalian buka file tersebut, kemudian
sesuaikan menjadi seperti di bawah ini :
<?php

namespace App\Http\Controllers\Api;

use App\Models\Statistik;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\StatistikResource;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class StatistikController extends Controller


{
/**
* index
*
* @return void
*/
public function index()
{
//get posts
$statistiks = Statistik::skip(0)->take(3)->get();

//return collection of posts as a resource


return new StatistikResource(true, 'List Data Posts', $statistiks);
}

/**
* store
*
* @param mixed $request
* @return void
*/
public function store(Request $request)
{
//define validation rules
$validator = Validator::make($request->all(), [
'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'title' => 'required',
'content' => 'required',
]);

//check if validation fails


if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//upload image
$image = $request->file('image');
$image->storeAs('public/statistiks', $image->hashName());

//create post
$statistiks = Statistik::create([
'image' => $image->hashName(),
'title' => $request->title,
'content' => $request->content,
]);

//return response
return new StatistikResource(true, 'Data Post Berhasil Ditambahkan!',
$statistiks);
}

/**
* show
*
* @param mixed $post
* @return void
*/
public function show(Statistik $statistik)
{
//return single post as a resource
return new StatistikResource(true, 'Data Post Ditemukan!', $statistik);
}

/**
* update
*
* @param mixed $request
* @param mixed $post
* @return void
*/
public function update(Request $request, Statistik $statistik)
{
//define validation rules
$validator = Validator::make($request->all(), [
'title' => 'required',
'content' => 'required',
]);

//check if validation fails


if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//check if image is not empty


if ($request->hasFile('image')) {

//upload image
$image = $request->file('image');
$image->storeAs('public/statistiks', $image->hashName());

//delete old image


Storage::delete('public/statistiks/'.$statistik->image);

//update post with new image


$statistik->update([
'image' => $image->hashName(),
'title' => $request->title,
'content' => $request->content,
]);

} else {

//update post without image


$statistik->update([
'title' => $request->title,
'content' => $request->content,
]);
}

//return response
return new StatistikResource(true, 'Data Home Berhasil Diubah!',
$statistik);
}

/**
* destroy
*
* @param mixed $post
* @return void
*/
public function destroy(Statistik $Statistik)
{
//delete image
Storage::delete('public/statistiks/'.$Statistik->image);

//delete post
$Statistik->delete();

//return response
return new StatistikResource(true, 'Data Post Berhasil Dihapus!', null);
}
}
Controller tersebut dapat digunakan untuk
proses CRUD atau Create, Read, Update dan Delete, tapi didalam laravel istilah itu
sedikit berbeda seperti pada penjelasan dibawah ini

Function keterangan

index menampilkan list data Statistik dari database

store menyimpan data informasi ke dalam database

menampilkan data statistik berdasarkan ID yang di dapatkan dari


show
parameter URL

update update data informasi ke dalam database berdasarkan ID

destroy Menghapus data statistik dari database berdasarkan ID

Route Statistik
Setelah berhasil membuat controller dan beberapa method di dalamnya, sekarang
kita lanjutkan untuk membuat route agar controller dan method tersebut dapat
digunakan. Silahkan buka file routes/api.php kemudian tambahkan route di bawah
ini di dalam prefix admin dan group middleware auth:api dan tepatnya di
bawah route info. Maka secara keseluruhan akan menjadi seperti di bawah ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);
//Route Post
Route::apiResource('/posts',
App\Http\Controllers\Api\Admin\PostController::class);
//Users
Route::apiResource('/users',
App\Http\Controllers\Api\Admin\UserController::class);
//Route Saran
Route::apiResource('/saran', App\Http\Controllers\Api\SaranController::class);
//Route Profil
Route::apiResource('/profile',
App\Http\Controllers\Api\SaranController::class);
//Route Informasi
Route::apiResource('/info',
App\Http\Controllers\Api\InformasiController::class);
//Route Statistik
Route::apiResource('/statistiks',
App\Http\Controllers\Api\StatistikController::class);
});

Dari routes di atas kita berhasil membuat url design sebagai berikut :

1. http://localhost:8000/api/statistiks

Url endpoint di atas bisa di gunakan sebagai API untuk di konsumsi oleh platform
lainnya. Pada langkah selanjutnya kita akan melakukan uji coba pada api yang
sudah kita buat menggunakan aplikasi postman.
FRONT END API
Category API
Controller
Setelah sebelumnya kita membuat beberapa RESTFUL API untuk
proses CRUD yang bersifat private dan bisa di gunakan dengan token JWT, maka
sekarang kita akan lanjutkan untuk membuat REST API yang nantinya akan kita
gunakan untuk menampilkan data ke dalam platform mobile tanpa menggunakan
Token JWT.

Disini kita tidak akan membuat sebuah Resource lagi, karena kita cukup
menggunakan Resource yang sudah kita buat sebelumnya.

Sekarang kita akan belajar bagaimana cara membuat Rest API untuk
menampilkan list data categoris dan juga menampilkan list data posts berdasarkan
masing-masing category. Silahkan jalankan perintah berikut ini di dalam
terminal/CMD :
php artisan make:controller Api/Web/CategoryController

Jika kalian memasukkan perintah di atas, maka otomatis kita akan mendapatkan
sebuah file baru yang bernama CategoryController.php yang tersimpan di dalam
direktori app/Http/Controllers/Api/Web/.

Silahkan kalian buka file tersebut, kemudian sesuaikan menjadi seperti di bawah ini :
<?php

namespace App\Http\Controllers\Api\Web;

use App\Http\Controllers\Controller;
use App\Http\Resources\CategoryResource;
use App\Models\Category;

class CategoryController extends Controller


{
/**
* index
*
* @return void
*/
public function index()
{
$categories = Category::latest()->paginate(10);

//return with Api Resource


return new CategoryResource(true, 'List Data Categories', $categories);
}
/**
* show
*
* @param mixed $slug
* @return void
*/
public function show($slug)
{
$category = Category::with('posts.category', 'posts.comments')-
>where('slug', $slug)->first();

if($category) {
//return with Api Resource
return new CategoryResource(true, 'List Data Post By Category',
$category);
}

//return with Api Resource


return new CategoryResource(false, 'Data Category Tidak Ditemukan!',
null);
}

/**
* categorySidebar
*
* @return void
*/
public function categorySidebar()
{
$categories = Category::orderBy('name', 'ASC')->get();

//return with Api Resource


return new CategoryResource(true, 'List Data Categories Sidebar',
$categories);
}
}

Seperti pada penjelasan sebelumnya, Controller tersebut dapat digunakan sebatas


untuk proses Menampilkan Data , dengan masing-masing keterangan seperti
dibawah ini :

Function keterangan

index menampilkan list data categories dari database

menampilkan data category berdasarkan slug yang di dapatkan dari


show
parameter URL

Menampilkan data categories sesuai urutan nama (Ascending (ASC))


categorySidebar
(A-Z)
Set Route
Setelah berhasil membuat controller beserta method-method di dalamnya, maka
sekarang kita lanjutkan untuk membuatkan route untuk controller tersebut.

Silahkan buka file routes/api.php kemudian tambahkan route berikut ini di


dalam prefix web dan dan di luar dari prefix admin Maka seacara keseluruhan akan
menjadi seperti dibawah ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);
//Poss
Route::apiResource('/posts',
App\Http\Controllers\Api\Admin\PostController::class);
//Users
Route::apiResource('/users',
App\Http\Controllers\Api\Admin\UserController::class);
});

Route::prefix('web')->group(function () {

//index categories
Route::get('/categories', [App\Http\Controllers\Api\Web\CategoryController::class,
'index']);

//show category
Route::get('/categories/{slug}',
[App\Http\Controllers\Api\Web\CategoryController::class, 'show']);
//categories sidebar
Route::get('/categorySidebar',
[App\Http\Controllers\Api\Web\CategoryController::class, 'categorySidebar']);

});

Dari routes di atas kita berhasil membuat url design sebagai berikut :

1. http://localhost:8000/api/web/categories
2. http://localhost:8000/api/web/categories/slug
3. http://localhost:8000/api/web/categorySidebar

Url endpoint diatas bisa gunakan sebagai API untuk digunakan ke dalam platform
lainnya. Pada langkah selanjutnya kita akan melakukan uji coba pada API yang
sudah kita buat menggunakan aplikasi postman.
Post API
Controller
Sekarang kita akan belajar bagaimana cara membuat Rest API untuk
menampilkan list data posts dan juga
menampilkan list data comments berdasarkan posts id.

Sekarang kita akan belajar cara membuat controller baru untuk Rest API Post.
Silahkan jalankan perintah berikut ini di dalam terminal/CMD :
php artisan make:controller Api/Web/PostController

Jika kalian menjalankan perintah di atas, maka otomatis kita akan mendapatkan
sebuah file baru yang bernama PostController.php yang tersimpan di dalam
direktori app/Http/Controllers/Api/Web/.

Silahkan kalian buka file tersebut, kemudian sesuaikan menjadi seperti di bawah ini :
<?php

namespace App\Http\Controllers\Api\Web;

use App\Models\Post;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\PostResource;
use Illuminate\Support\Facades\Validator;

class PostController extends Controller


{
/**
* index
*
* @return void
*/
public function index()
{
$posts = Post::with('user', 'category', 'comments')->when(request()->q,
function($posts) {
$posts = $posts->where('title', 'like', '%'. request()->q . '%');
})->latest()->paginate(6);

//return with Api Resource


return new PostResource(true, 'List Data Posts', $posts);
}

/**
* show
*
* @param mixed $slug
* @return void
*/
public function show($slug)
{
$post = Post::with('user', 'category', 'comments')->where('slug', $slug)-
>first();

if($post) {
//return with Api Resource
return new PostResource(true, 'Detail Data Post', $post);
}

//return with Api Resource


return new PostResource(true, 'Detail Data Post Tidak Ditemukan!', null);

/**
* postHomepage
*
* @return void
*/
public function postHomepage()
{
$posts = Post::with('user', 'category', 'comments')->take(5)->latest()-
>get();

//return with Api Resource


return new PostResource(true, 'List Data Posts Homepahe', $posts);
}

/**
* storeComment
*
* @param mixed $request
* @return void
*/
public function storeComment(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'comment' => 'required'
]);

if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}

//get Post by slug


$post = Post::where('slug', $request->slug)->first();

//store comment
$post->comments()->create([
'name' => $request->name,
'email' => $request->email,
'comment' => $request->comment
]);

//return with Api Resource


return new PostResource(true, 'Comment Berhasil Disimpan!', $post-
>comments()->get());
}

Seperti pada penjelasan sebelumnya, Controller tersebut dapat digunakan sebatas


untuk proses Menampilkan Data dan juga menambahkan data untuk komentar,
dengan masing-masing keterangan seperti dibawah ini :

Function keterangan

index menampilkan list data posts dari database

menampilkan data posts berdasarkan slug yang di dapatkan dari


show
parameter URL

postHomepage Menampilkan data posts dengan maksimal 5 posts

storeComment Menyimpan komentar berdasarkan post_id

Set Route
Setelah berhasil membuat controller beserta method-method di dalamnya, maka
sekarang kita lanjutkan untuk membuatkan route untuk controller tersebut.

Silahkan buka file routes/api.php kemudian tambahkan route berikut ini di


dalam prefix web dan dan di luar dari prefix admin Maka secara keseluruhan akan
menjadi seperti dibawah ini :
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::prefix('admin')->group(function () {

//route login
Route::post('/login', [App\Http\Controllers\Api\Admin\LoginController::class,
'index']);

//group route with middleware "auth"


Route::group(['middleware' => 'auth:api'], function() {

//data user
Route::get('/user',
[App\Http\Controllers\Api\Admin\LoginController::class, 'getUser']);

//refresh token JWT


Route::get('/refresh',
[App\Http\Controllers\Api\Admin\LoginController::class, 'refreshToken']);

//logout
Route::post('/logout',
[App\Http\Controllers\Api\Admin\LoginController::class, 'logout']);

});
//Category
Route::apiResource('/categories',
App\Http\Controllers\Api\Admin\CategoryController::class);
//Poss
Route::apiResource('/posts',
App\Http\Controllers\Api\Admin\PostController::class);
//Users
Route::apiResource('/users',
App\Http\Controllers\Api\Admin\UserController::class);
});
Route::prefix('web')->group(function () {

//index categories
Route::get('/categories', [App\Http\Controllers\Api\Web\CategoryController::class,
'index']);

//show category
Route::get('/categories/{slug}',
[App\Http\Controllers\Api\Web\CategoryController::class, 'show']);

//categories sidebar
Route::get('/categorySidebar',
[App\Http\Controllers\Api\Web\CategoryController::class, 'categorySidebar']);

//index posts
Route::get('/posts', [App\Http\Controllers\Api\Web\PostController::class,
'index']);

//show posts
Route::get('/posts/{slug}', [App\Http\Controllers\Api\Web\PostController::class,
'show']);

//posts homepage
Route::get('/postHomepage', [App\Http\Controllers\Api\Web\PostController::class,
'postHomepage']);

//store comment
Route::post('/posts/storeComment',
[App\Http\Controllers\Api\Web\PostController::class, 'storeComment']);

});

Dari routes di atas kita berhasil membuat url design sebagai berikut :

1. http://localhost:8000/api/web/posts
2. http://localhost:8000/api/web/posts/slug
3. http://localhost:8000/api/web/postHomepage
4. http://localhost:8000/api/web/storeComment
Url endpoint diatas bisa gunakan sebagai API untuk digunakan ke dalam platform
lainnya. Pada langkah selanjutnya kita akan melakukan uji coba pada API yang
sudah kita buat menggunakan aplikasi postman.

Anda mungkin juga menyukai